[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