[clang-tidy] MemsetZeroLenghtChecker: Don't crash trying to evaluate dependent values.
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 17 Jul 2014 08:56:55 +0000 (08:56 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 17 Jul 2014 08:56:55 +0000 (08:56 +0000)
llvm-svn: 213238

clang-tools-extra/clang-tidy/google/MemsetZeroLengthCheck.cpp
clang-tools-extra/test/clang-tidy/google-memset-zero-length.cpp

index b9b776e..7e60a52 100644 (file)
@@ -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;
index b5393bd..91eae36 100644 (file)
@@ -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>();
 }