]> granicus.if.org Git - clang/commitdiff
[analyzer] Treat MSVC's _wassert as noreturn.
authorJordan Rose <jordan_rose@apple.com>
Thu, 14 Nov 2013 17:55:00 +0000 (17:55 +0000)
committerJordan Rose <jordan_rose@apple.com>
Thu, 14 Nov 2013 17:55:00 +0000 (17:55 +0000)
This makes sure the analyzer actually honors assert() in an MSVC project.

Patch by Anders Montonen!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@194716 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/NoReturnFunctionChecker.cpp
test/Analysis/NoReturn.m

index d7a880c6604baad083b79bf400bf0c39bd2acd5e..0e1064ef53a6cabad8a1b3a0a24fe7602aad3e3c 100644 (file)
@@ -64,6 +64,9 @@ void NoReturnFunctionChecker::checkPostCall(const CallEvent &CE,
             .Case("assfail", true)
             .Case("db_error", true)
             .Case("__assert", true)
+            // For the purpose of static analysis, we do not care that
+            //  this MSVC function will return if the user decides to continue.
+            .Case("_wassert", true)
             .Case("__assert_rtn", true)
             .Case("__assert_fail", true)
             .Case("dtrace_assfail", true)
index a58efdd0294850cc31980ba1bbdbfb40c1b9c773..c74d54eae528c48def81be0bc1f5ca8e7b74f105 100644 (file)
@@ -123,3 +123,11 @@ void PR11959(int *p) {
   *p = 0xDEADBEEF; // no-warning
 }
 
+// Test that hard-coded Microsoft _wassert name is recognized as a noreturn
+#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(#_Expression, __FILE__, __LINE__), 0) )
+extern void _wassert(const char * _Message, const char *_File, unsigned _Line);
+void test_wassert() {
+  assert(0);
+  int *p = 0;
+  *p = 0xDEADBEEF; // no-warning
+}