[cfe-commits] r138004 - in /cfe/trunk: lib/Sema/SemaChecking.cpp test/Sema/warn-strlcpycat-size.c

Ted Kremenek kremenek at apple.com
Thu Aug 18 15:48:41 PDT 2011


Author: kremenek
Date: Thu Aug 18 17:48:41 2011
New Revision: 138004

URL: http://llvm.org/viewvc/llvm-project?rev=138004&view=rev
Log:
Enhance -Wstrl-incorrect-size to not report a FIXIT for destinations that are flexible arrays or have size 1.

Modified:
    cfe/trunk/lib/Sema/SemaChecking.cpp
    cfe/trunk/test/Sema/warn-strlcpycat-size.c

Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=138004&r1=138003&r2=138004&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Thu Aug 18 17:48:41 2011
@@ -2071,18 +2071,26 @@
   // pointers if we know the actual size, like if DstArg is 'array+2'
   // we could say 'sizeof(array)-2'.
   const Expr *DstArg = Call->getArg(0)->IgnoreParenImpCasts();
+  QualType DstArgTy = DstArg->getType();
   
-  if (DstArg->getType()->isArrayType()) {
-    llvm::SmallString<128> sizeString;
-    llvm::raw_svector_ostream OS(sizeString);
-    OS << "sizeof(";
-    DstArg->printPretty(OS, Context, 0, Context.PrintingPolicy);
-    OS << ")";
-    
-    Diag(OriginalSizeArg->getLocStart(), diag::note_strlcpycat_wrong_size)
-      << FixItHint::CreateReplacement(OriginalSizeArg->getSourceRange(),
-                                      OS.str());
+  // Only handle constant-sized or VLAs, but not flexible members.
+  if (const ConstantArrayType *CAT = Context.getAsConstantArrayType(DstArgTy)) {
+    // Only issue the FIXIT for arrays of size > 1.
+    if (CAT->getSize().getSExtValue() <= 1)
+      return;
+  } else if (!DstArgTy->isVariableArrayType()) {
+    return;
   }
+
+  llvm::SmallString<128> sizeString;
+  llvm::raw_svector_ostream OS(sizeString);
+  OS << "sizeof(";
+  DstArg->printPretty(OS, Context, 0, Context.PrintingPolicy);
+  OS << ")";
+  
+  Diag(OriginalSizeArg->getLocStart(), diag::note_strlcpycat_wrong_size)
+    << FixItHint::CreateReplacement(OriginalSizeArg->getSourceRange(),
+                                    OS.str());
 }
 
 //===--- CHECK: Return Address of Stack Variable --------------------------===//

Modified: cfe/trunk/test/Sema/warn-strlcpycat-size.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-strlcpycat-size.c?rev=138004&r1=138003&r2=138004&view=diff
==============================================================================
--- cfe/trunk/test/Sema/warn-strlcpycat-size.c (original)
+++ cfe/trunk/test/Sema/warn-strlcpycat-size.c Thu Aug 18 17:48:41 2011
@@ -26,3 +26,30 @@
   strlcpy((*s5)->f2[x], s2, sizeof(s2)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}}
   strlcpy(s1+3, s2, sizeof(s2)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}}
 }
+
+// Don't issue FIXIT for flexible arrays.
+struct S {
+  int y; 
+  char x[];
+};
+
+void flexible_arrays(struct S *s) {
+  char str[] = "hi";
+  strlcpy(s->x, str, sizeof(str));  // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}}
+}
+
+// Don't issue FIXIT for destinations of size 1.
+void size_1() {
+  char z[1];
+  char str[] = "hi";
+
+  strlcpy(z, str, sizeof(str));  // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}}
+}
+
+// Support VLAs.
+void vlas(int size) {
+  char z[size];
+  char str[] = "hi";
+
+  strlcpy(z, str, sizeof(str)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}}
+}





More information about the cfe-commits mailing list