| // RUN: %check_clang_tidy %s bugprone-suspicious-memset-usage %t |
| |
| void *memset(void *, int, __SIZE_TYPE__); |
| |
| namespace std { |
| using ::memset; |
| } |
| |
| template <typename T> |
| void mtempl(int *ptr) { |
| memset(ptr, '0', sizeof(T)); |
| // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: memset fill value is char '0', potentially mistaken for int 0 [bugprone-suspicious-memset-usage] |
| // CHECK-FIXES: memset(ptr, 0, sizeof(T)); |
| memset(ptr, 256, sizeof(T)); |
| // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: memset fill value is out of unsigned character range, gets truncated [bugprone-suspicious-memset-usage] |
| memset(0, sizeof(T), 0); |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: memset of size zero, potentially swapped arguments [bugprone-suspicious-memset-usage] |
| // CHECK-FIXES: memset(0, 0, sizeof(T)); |
| memset(0, sizeof(int), 0); |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: memset of size zero, potentially swapped arguments [bugprone-suspicious-memset-usage] |
| // CHECK-FIXES: memset(0, 0, sizeof(int)); |
| } |
| |
| void foo(int xsize, int ysize) { |
| int i[5] = {1, 2, 3, 4, 5}; |
| char ca[3] = {'a', 'b', 'c'}; |
| int *p = i; |
| int l = 5; |
| char z = '1'; |
| char *c = &z; |
| int v = 0; |
| |
| memset(p, '0', l); |
| // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: memset fill value is char '0', potentially mistaken for int 0 [bugprone-suspicious-memset-usage] |
| // CHECK-FIXES: memset(p, 0, l); |
| |
| memset(p, 0xabcd, l); |
| // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: memset fill value is out of unsigned character range, gets truncated [bugprone-suspicious-memset-usage] |
| |
| memset(p, sizeof(int), 0); |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: memset of size zero, potentially swapped arguments [bugprone-suspicious-memset-usage] |
| // CHECK-FIXES: memset(p, 0, sizeof(int)); |
| std::memset(p, sizeof(int), 0x00); |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: memset of size zero, potentially swapped arguments [bugprone-suspicious-memset-usage] |
| // CHECK-FIXES: std::memset(p, 0x00, sizeof(int)); |
| |
| #define M_CHAR_ZERO memset(p, '0', l); |
| M_CHAR_ZERO |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: memset fill value is char '0', potentially mistaken for int 0 [bugprone-suspicious-memset-usage] |
| |
| #define M_OUTSIDE_RANGE memset(p, 0xabcd, l); |
| M_OUTSIDE_RANGE |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: memset fill value is out of unsigned character range, gets truncated [bugprone-suspicious-memset-usage] |
| |
| #define M_ZERO_LENGTH memset(p, sizeof(int), 0); |
| M_ZERO_LENGTH |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: memset of size zero, potentially swapped arguments [bugprone-suspicious-memset-usage] |
| |
| memset(p, '2', l); |
| memset(p, 0, l); |
| memset(c, '0', 1); |
| memset(ca, '0', sizeof(ca)); |
| |
| memset(p, 0x00, l); |
| mtempl<int>(p); |
| |
| memset(p, sizeof(int), v + 1); |
| memset(p, 0xcd, 1); |
| |
| // Don't warn when the fill char and the length are both known to be |
| // zero. No bug is possible. |
| memset(p, 0, v); |
| |
| // -1 is clearly not a length by virtue of being negative, so no warning |
| // despite v == 0. |
| memset(p, -1, v); |
| } |