r357041 - Emit -Wfortify-source using DiagRuntimeBehaviour

Erik Pilkington via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 26 16:21:23 PDT 2019


Author: epilk
Date: Tue Mar 26 16:21:22 2019
New Revision: 357041

URL: http://llvm.org/viewvc/llvm-project?rev=357041&view=rev
Log:
Emit -Wfortify-source using DiagRuntimeBehaviour

This fixes a false positive on the following, where st is configured to have
different sizes based on some preprocessor logic:

  if (sizeof(buf) == sizeof(*st))
    memcpy(&buf, st, sizeof(*st));

Modified:
    cfe/trunk/lib/Sema/SemaChecking.cpp
    cfe/trunk/test/Sema/warn-fortify-source.c

Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=357041&r1=357040&r2=357041&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Tue Mar 26 16:21:22 2019
@@ -431,9 +431,10 @@ void Sema::checkFortifiedBuiltinMemoryFu
     FunctionName = FunctionName.drop_front(std::strlen("__builtin_"));
   }
 
-  Diag(TheCall->getBeginLoc(), DiagID)
-      << FunctionName << ObjectSize.toString(/*Radix=*/10)
-      << UsedSize.toString(/*Radix=*/10);
+  DiagRuntimeBehavior(TheCall->getBeginLoc(), TheCall,
+                      PDiag(DiagID)
+                          << FunctionName << ObjectSize.toString(/*Radix=*/10)
+                          << UsedSize.toString(/*Radix=*/10));
 }
 
 static bool SemaBuiltinSEHScopeCheck(Sema &SemaRef, CallExpr *TheCall,

Modified: cfe/trunk/test/Sema/warn-fortify-source.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-fortify-source.c?rev=357041&r1=357040&r2=357041&view=diff
==============================================================================
--- cfe/trunk/test/Sema/warn-fortify-source.c (original)
+++ cfe/trunk/test/Sema/warn-fortify-source.c Tue Mar 26 16:21:22 2019
@@ -20,6 +20,9 @@ void call_memcpy() {
   char dst[10];
   char src[20];
   memcpy(dst, src, 20); // expected-warning {{memcpy' will always overflow; destination buffer has size 10, but size argument is 20}}
+
+  if (sizeof(dst) == sizeof(src))
+    memcpy(dst, src, 20); // no warning, unreachable
 }
 
 void call_memcpy_type() {




More information about the cfe-commits mailing list