Hi zaks.anna, klimek,
Hi Anna,
This patch fixes a regression introduced by r224398. Prior to r224398 (e.g. in
llvm 3.5) we were able to analyze the following code in test-include.c and
report a null deref in this case. But post r224398 this analysis is being
skipped as a result we miss many bugs in our codebase.
E.g.
// test-include.c
#include "test-include.h"
void test(int * data) {
data = 0;
*data = 1;
}
// test-include.h
void test(int * data);
This patch checks if the function declaration has a body in the mainfile
currently being analyzed if yes then RunPathSensitiveChecks on the same. This
fixes the above issue without any regressions.
Please let me know if you feel this patch looks good to you or if you feel
there is a better way to fix the same.
Thanks and Regards
Karthik Bhat
http://reviews.llvm.org/D10156
Files:
lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
test/Analysis/test-include.c
test/Analysis/test-include.h
Index: lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
===================================================================
--- lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
+++ lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
@@ -592,6 +592,11 @@
if (!Opts->AnalyzeAll && !SM.isWrittenInMainFile(SL)) {
if (SL.isInvalid() || SM.isInSystemHeader(SL))
return AM_None;
+ // Check if the definition of the function declaration has a body.
+ // Return the current analysis mode if the definition is in the main file.
+ if (D->hasBody())
+ if (SM.isInMainFile(D->getBody()->getLocStart()))
+ return Mode;
return Mode & ~AM_Path;
}
Index: test/Analysis/test-include.c
===================================================================
--- test/Analysis/test-include.c
+++ test/Analysis/test-include.c
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify %s
+#include "test-include.h"
+void test(int * data) {
+ data = 0;
+ *data = 1; // expected-warning{{Dereference of null pointer}}
+}
Index: test/Analysis/test-include.h
===================================================================
--- test/Analysis/test-include.h
+++ test/Analysis/test-include.h
@@ -0,0 +1 @@
+void test(int * data);
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
Index: lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
===================================================================
--- lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
+++ lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
@@ -592,6 +592,11 @@
if (!Opts->AnalyzeAll && !SM.isWrittenInMainFile(SL)) {
if (SL.isInvalid() || SM.isInSystemHeader(SL))
return AM_None;
+ // Check if the definition of the function declaration has a body.
+ // Return the current analysis mode if the definition is in the main file.
+ if (D->hasBody())
+ if (SM.isInMainFile(D->getBody()->getLocStart()))
+ return Mode;
return Mode & ~AM_Path;
}
Index: test/Analysis/test-include.c
===================================================================
--- test/Analysis/test-include.c
+++ test/Analysis/test-include.c
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify %s
+#include "test-include.h"
+void test(int * data) {
+ data = 0;
+ *data = 1; // expected-warning{{Dereference of null pointer}}
+}
Index: test/Analysis/test-include.h
===================================================================
--- test/Analysis/test-include.h
+++ test/Analysis/test-include.h
@@ -0,0 +1 @@
+void test(int * data);
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits