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;
 }


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;
 }
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to