[PATCH] [Static Analyzer] Fix Analysis being skipped for code with declarations in .h file
Karthik Bhat
kv.bhat at samsung.com
Fri Jun 26 01:44:08 PDT 2015
Hi Anna,
Thanks for the input. Your code seems much more structured. Updated the code and tests as per your comments.
I had added-
if (SM.isInMainFile(SL))
return Mode;
because my understanding was we do not analyze header files till analyze-all option is specified but it seems i was wrong we do analyze function definition inside header files if called from the main file(checked in llvm 3.5). Updated the code to remove the check.
Please let me know if you have any other comments on this patch.
Thanks for your time.
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
@@ -588,7 +588,10 @@
// - Header files: run non-path-sensitive checks only.
// - System headers: don't run any checks.
SourceManager &SM = Ctx->getSourceManager();
- SourceLocation SL = SM.getExpansionLoc(D->getLocation());
+ SourceLocation SL = D->hasBody() ? D->getBody()->getLocStart()
+ : D->getLocation();
+ SL = SM.getExpansionLoc(SL);
+
if (!Opts->AnalyzeAll && !SM.isWrittenInMainFile(SL)) {
if (SL.isInvalid() || SM.isInSystemHeader(SL))
return AM_None;
Index: test/Analysis/test-include.c
===================================================================
--- test/Analysis/test-include.c
+++ test/Analysis/test-include.c
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify %s
+#include "test-include.h"
+#define DIVYX(X,Y) Y/X
+
+void test_01(int * data) {
+ data = 0;
+ *data = 1; // expected-warning{{Dereference of null pointer}}
+}
+
+int test_02() {
+ int res = DIVXY(1,0); // expected-warning{{Division by zero}}
+ // expected-warning at -1{{division by zero is undefined}}
+ return res;
+}
+
+int test_03() {
+ int res = DIVYX(0,1); // expected-warning{{Division by zero}}
+ // expected-warning at -1{{division by zero is undefined}}
+ return res;
+}
+
Index: test/Analysis/test-include.h
===================================================================
--- test/Analysis/test-include.h
+++ test/Analysis/test-include.h
@@ -0,0 +1,2 @@
+void test_01(int * data);
+#define DIVXY(X,Y) X/Y
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10156.28545.patch
Type: text/x-patch
Size: 1773 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150626/74d2658e/attachment.bin>
More information about the cfe-commits
mailing list