| 1 | // RUN: %check_clang_tidy %s bugprone-misplaced-operator-in-strlen-in-alloc %t |
| 2 | |
| 3 | namespace std { |
| 4 | typedef __typeof(sizeof(int)) size_t; |
| 5 | void *malloc(size_t); |
| 6 | |
| 7 | size_t strlen(const char *); |
| 8 | } // namespace std |
| 9 | |
| 10 | namespace non_std { |
| 11 | typedef __typeof(sizeof(int)) size_t; |
| 12 | void *malloc(size_t); |
| 13 | |
| 14 | size_t strlen(const char *); |
| 15 | } // namespace non_std |
| 16 | |
| 17 | void bad_std_malloc_std_strlen(char *name) { |
| 18 | char *new_name = (char *)std::malloc(std::strlen(name + 1)); |
| 19 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: addition operator is applied to the argument of strlen |
| 20 | // CHECK-FIXES: {{^ char \*new_name = \(char \*\)std::malloc\(}}std::strlen(name) + 1{{\);$}} |
| 21 | } |
| 22 | |
| 23 | void ignore_non_std_malloc_std_strlen(char *name) { |
| 24 | char *new_name = (char *)non_std::malloc(std::strlen(name + 1)); |
| 25 | // CHECK-MESSAGES-NOT: :[[@LINE-1]]:28: warning: addition operator is applied to the argument of strlen |
| 26 | // Ignore functions of the malloc family in custom namespaces |
| 27 | } |
| 28 | |
| 29 | void ignore_std_malloc_non_std_strlen(char *name) { |
| 30 | char *new_name = (char *)std::malloc(non_std::strlen(name + 1)); |
| 31 | // CHECK-MESSAGES-NOT: :[[@LINE-1]]:28: warning: addition operator is applied to the argument of strlen |
| 32 | // Ignore functions of the strlen family in custom namespaces |
| 33 | } |
| 34 | |
| 35 | void bad_new_strlen(char *name) { |
| 36 | char *new_name = new char[std::strlen(name + 1)]; |
| 37 | // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: addition operator is applied to the argument of strlen |
| 38 | // CHECK-FIXES: {{^ char \*new_name = new char\[}}std::strlen(name) + 1{{\];$}} |
| 39 | } |
| 40 | |
| 41 | void good_new_strlen(char *name) { |
| 42 | char *new_name = new char[std::strlen(name) + 1]; |
| 43 | // CHECK-MESSAGES-NOT: :[[@LINE-1]]:20: warning: addition operator is applied to the argument of strlen |
| 44 | } |
| 45 | |
| 46 | class C { |
| 47 | char c; |
| 48 | public: |
| 49 | static void *operator new[](std::size_t count) { |
| 50 | return ::operator new(count); |
| 51 | } |
| 52 | }; |
| 53 | |
| 54 | void bad_custom_new_strlen(char *name) { |
| 55 | C *new_name = new C[std::strlen(name + 1)]; |
| 56 | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: addition operator is applied to the argument of strlen |
| 57 | // CHECK-FIXES: {{^ C \*new_name = new C\[}}std::strlen(name) + 1{{\];$}} |
| 58 | } |
| 59 | |