| // RUN: %check_clang_tidy %s bugprone-sizeof-container %t -- -- -std=c++11 -target x86_64-unknown-unknown |
| |
| namespace std { |
| |
| typedef unsigned int size_t; |
| |
| template <typename T> |
| struct basic_string { |
| size_t size() const; |
| }; |
| |
| template <typename T> |
| basic_string<T> operator+(const basic_string<T> &, const T *); |
| |
| typedef basic_string<char> string; |
| |
| template <typename T> |
| struct vector { |
| size_t size() const; |
| }; |
| |
| // std::bitset<> is not a container. sizeof() is reasonable for it. |
| template <size_t N> |
| struct bitset { |
| size_t size() const; |
| }; |
| |
| // std::array<> is, well, an array. sizeof() is reasonable for it. |
| template <typename T, size_t N> |
| struct array { |
| size_t size() const; |
| }; |
| |
| class fake_container1 { |
| size_t size() const; // non-public |
| }; |
| |
| struct fake_container2 { |
| size_t size(); // non-const |
| }; |
| |
| } |
| |
| using std::size_t; |
| |
| #define ARRAYSIZE(a) \ |
| ((sizeof(a) / sizeof(*(a))) / static_cast<size_t>(!(sizeof(a) % sizeof(*(a))))) |
| |
| #define ARRAYSIZE2(a) \ |
| (((sizeof(a)) / (sizeof(*(a)))) / static_cast<size_t>(!((sizeof(a)) % (sizeof(*(a)))))) |
| |
| struct string { |
| std::size_t size() const; |
| }; |
| |
| template<typename T> |
| void g(T t) { |
| (void)sizeof(t); |
| } |
| |
| void f() { |
| string s1; |
| std::string s2; |
| std::vector<int> v; |
| |
| int a = 42 + sizeof(s1); |
| // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: sizeof() doesn't return the size of the container; did you mean .size()? [bugprone-sizeof-container] |
| a = 123 * sizeof(s2); |
| // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: sizeof() doesn't return the size |
| a = 45 + sizeof(s2 + "asdf"); |
| // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: sizeof() doesn't return the size |
| a = sizeof(v); |
| // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: sizeof() doesn't return the size |
| a = sizeof(std::vector<int>{}); |
| // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: sizeof() doesn't return the size |
| |
| a = sizeof(a); |
| a = sizeof(int); |
| a = sizeof(std::string); |
| a = sizeof(std::vector<int>); |
| |
| g(s1); |
| g(s2); |
| g(v); |
| |
| std::fake_container1 fake1; |
| std::fake_container2 fake2; |
| std::bitset<7> std_bitset; |
| std::array<int, 3> std_array; |
| |
| a = sizeof(fake1); |
| a = sizeof(fake2); |
| a = sizeof(std_bitset); |
| a = sizeof(std_array); |
| |
| |
| std::string arr[3]; |
| a = ARRAYSIZE(arr); |
| a = ARRAYSIZE2(arr); |
| a = sizeof(arr) / sizeof(arr[0]); |
| |
| (void)a; |
| } |