xazax.hun created this revision.
Herald added subscribers: szepet, baloghadamsoftware, whisperity.

For some reason, `__builtin_debugtrap` is not a sink for the analyzer. I also 
added some test cases to demonstrate that `__builtin_trap` and 
`__builtin_unreachable` are handled properly. The former is not marked as 
noreturn while the last two are. See Builtins.def for details. It was made 
non-noreturn deliberately, see https://reviews.llvm.org/rL166345
I have however no idea why.


https://reviews.llvm.org/D39551

Files:
  lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp
  test/Analysis/builtin-functions.cpp


Index: test/Analysis/builtin-functions.cpp
===================================================================
--- test/Analysis/builtin-functions.cpp
+++ test/Analysis/builtin-functions.cpp
@@ -63,4 +63,18 @@
     clang_analyzer_warnIfReached(); // Assumtion contradicts constraints.
                                     // We give up the analysis on this path.
   }
+  switch (i) {
+  case 1:
+    __builtin_unreachable();
+    clang_analyzer_warnIfReached();
+    break;
+  case 2:
+    __builtin_trap();
+    clang_analyzer_warnIfReached();
+    break;
+  case 3:
+    __builtin_debugtrap();
+    clang_analyzer_warnIfReached();
+    break;
+  }
 }
Index: lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp
===================================================================
--- lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp
+++ lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp
@@ -41,6 +41,10 @@
   default:
     return false;
 
+  case Builtin::BI__builtin_debugtrap:
+    C.generateSink(C.getState(), C.getPredecessor());
+    return true;
+
   case Builtin::BI__builtin_assume: {
     assert (CE->arg_begin() != CE->arg_end());
     SVal ArgSVal = state->getSVal(CE->getArg(0), LCtx);


Index: test/Analysis/builtin-functions.cpp
===================================================================
--- test/Analysis/builtin-functions.cpp
+++ test/Analysis/builtin-functions.cpp
@@ -63,4 +63,18 @@
     clang_analyzer_warnIfReached(); // Assumtion contradicts constraints.
                                     // We give up the analysis on this path.
   }
+  switch (i) {
+  case 1:
+    __builtin_unreachable();
+    clang_analyzer_warnIfReached();
+    break;
+  case 2:
+    __builtin_trap();
+    clang_analyzer_warnIfReached();
+    break;
+  case 3:
+    __builtin_debugtrap();
+    clang_analyzer_warnIfReached();
+    break;
+  }
 }
Index: lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp
===================================================================
--- lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp
+++ lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp
@@ -41,6 +41,10 @@
   default:
     return false;
 
+  case Builtin::BI__builtin_debugtrap:
+    C.generateSink(C.getState(), C.getPredecessor());
+    return true;
+
   case Builtin::BI__builtin_assume: {
     assert (CE->arg_begin() != CE->arg_end());
     SVal ArgSVal = state->getSVal(CE->getArg(0), LCtx);
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to