diff options
Diffstat (limited to 'clang-tools-extra')
| -rw-r--r-- | clang-tools-extra/clang-tidy/google/MemsetZeroLengthCheck.cpp | 6 | ||||
| -rw-r--r-- | clang-tools-extra/test/clang-tidy/google-memset-zero-length.cpp | 8 |
2 files changed, 10 insertions, 4 deletions
diff --git a/clang-tools-extra/clang-tidy/google/MemsetZeroLengthCheck.cpp b/clang-tools-extra/clang-tidy/google/MemsetZeroLengthCheck.cpp index b9b776e0b5c..7e60a529aef 100644 --- a/clang-tools-extra/clang-tidy/google/MemsetZeroLengthCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/MemsetZeroLengthCheck.cpp @@ -59,11 +59,13 @@ void MemsetZeroLengthCheck::check(const MatchFinder::MatchResult &Result) { // Try to evaluate the second argument so we can also find values that are not // just literals. llvm::APSInt Value1, Value2; - if (!Arg2->EvaluateAsInt(Value2, *Result.Context) || Value2 != 0) + if (Arg2->isValueDependent() || + !Arg2->EvaluateAsInt(Value2, *Result.Context) || Value2 != 0) return; // If both arguments evaluate to zero emit a warning without fix suggestions. - if (Arg1->EvaluateAsInt(Value1, *Result.Context) && + if (!Arg1->isValueDependent() && + Arg1->EvaluateAsInt(Value1, *Result.Context) && (Value1 == 0 || Value1.isNegative())) { diag(Call->getLocStart(), "memset of size zero"); return; diff --git a/clang-tools-extra/test/clang-tidy/google-memset-zero-length.cpp b/clang-tools-extra/test/clang-tidy/google-memset-zero-length.cpp index b5393bdb5e7..91eae365148 100644 --- a/clang-tools-extra/test/clang-tidy/google-memset-zero-length.cpp +++ b/clang-tools-extra/test/clang-tidy/google-memset-zero-length.cpp @@ -7,9 +7,13 @@ namespace std { using ::memset; } -template <int i> +template <int i, typename T> void memtmpl() { memset(0, sizeof(int), i); + memset(0, sizeof(T), sizeof(T)); + memset(0, sizeof(T), 0); +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: memset of size zero, potentially swapped argument +// CHECK-FIXES: memset(0, 0, sizeof(T)); memset(0, sizeof(int), 0); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: memset of size zero, potentially swapped argument // CHECK-FIXES: memset(0, 0, sizeof(int)); @@ -53,5 +57,5 @@ void foo(void *a, int xsize, int ysize) { // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: memset of size zero // CHECK-FIXES: memset(a, -1, v); - memtmpl<0>(); + memtmpl<0, int>(); } |

