[PATCH] D15410: AnalysisConsumer: use canonical decl for both lookup and store of visited decls
Aleksei Sidorin via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 10 01:09:24 PST 2015
a.sidorin created this revision.
a.sidorin added reviewers: zaks.anna, xazax.hun, dcoughlin.
a.sidorin added a subscriber: cfe-commits.
a.sidorin set the repository for this revision to rL LLVM.
Due to redeclarations, the function may have different declarations used in CallExpr and in the definition. However, we need to use a unique declaration for both store and lookup in VisitedCallees. This patch fixes issues with analysis in topological order. A simple test is included.
Repository:
rL LLVM
http://reviews.llvm.org/D15410
Files:
lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
test/Analysis/inlining/analysis-order.c
Index: test/Analysis/inlining/analysis-order.c
===================================================================
--- /dev/null
+++ test/Analysis/inlining/analysis-order.c
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -analyze -analyzer-checker=core.builtin.NoReturnFunctions -analyzer-display-progress %s 2>&1 | FileCheck %s
+
+// Do not analyze test1() again because it was inlined
+void test1();
+
+void test2() {
+ test1();
+}
+
+void test1() {
+}
+
+// CHECK: analysis-order.c test2
+// CHECK: analysis-order.c test1
+// CHECK: analysis-order.c test2
Index: lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
===================================================================
--- lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
+++ lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
@@ -483,7 +483,7 @@
// Skip the functions which have been processed already or previously
// inlined.
- if (shouldSkipFunction(D, Visited, VisitedAsTopLevel))
+ if (shouldSkipFunction(D->getCanonicalDecl(), Visited, VisitedAsTopLevel))
continue;
// Analyze the function.
Index: lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
===================================================================
--- lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
+++ lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
@@ -462,7 +462,7 @@
// Mark the decl as visited.
if (VisitedCallees)
- VisitedCallees->insert(D);
+ VisitedCallees->insert(D->getCanonicalDecl());
return true;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D15410.42396.patch
Type: text/x-patch
Size: 1503 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151210/6c04ec91/attachment.bin>
More information about the cfe-commits
mailing list