]> granicus.if.org Git - clang/commitdiff
[analyzer] Avoid querying this-pointers for static-methods.
authorMatt Davis <Matthew.Davis@sony.com>
Tue, 7 Aug 2018 23:13:28 +0000 (23:13 +0000)
committerMatt Davis <Matthew.Davis@sony.com>
Tue, 7 Aug 2018 23:13:28 +0000 (23:13 +0000)
Summary:
The loop-widening code processes c++ methods looking for `this` pointers.  In
the case of static methods (which do not have `this` pointers), an assertion
was triggering.   This patch avoids trying to process `this` pointers for
static methods, and thus avoids triggering the assertion .

Reviewers: dcoughlin, george.karpenkov, NoQ

Reviewed By: NoQ

Subscribers: NoQ, xazax.hun, szepet, a.sidorin, mikhail.ramalho, cfe-commits

Differential Revision: https://reviews.llvm.org/D50408

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@339201 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Core/LoopWidening.cpp
test/Analysis/loop-widening-ignore-static-methods.cpp [new file with mode: 0644]

index 9192f49eac6d21505e342726cd4ce769f26dcd3c..d7fed2558cdf27267caad537876eb81910a5eae4 100644 (file)
@@ -81,8 +81,10 @@ ProgramStateRef getWidenedLoopState(ProgramStateRef PrevState,
 
   // 'this' pointer is not an lvalue, we should not invalidate it. If the loop
   // is located in a method, constructor or destructor, the value of 'this'
-  // pointer shoule remain unchanged.
-  if (const CXXMethodDecl *CXXMD = dyn_cast<CXXMethodDecl>(STC->getDecl())) {
+  // pointer should remain unchanged.  Ignore static methods, since they do not
+  // have 'this' pointers.
+  const CXXMethodDecl *CXXMD = dyn_cast<CXXMethodDecl>(STC->getDecl());
+  if (CXXMD && !CXXMD->isStatic()) {
     const CXXThisRegion *ThisR = MRMgr.getCXXThisRegion(
         CXXMD->getThisType(STC->getAnalysisDeclContext()->getASTContext()),
         STC);
diff --git a/test/Analysis/loop-widening-ignore-static-methods.cpp b/test/Analysis/loop-widening-ignore-static-methods.cpp
new file mode 100644 (file)
index 0000000..bcf4f8b
--- /dev/null
@@ -0,0 +1,12 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-config widen-loops=true -analyzer-max-loop 2 %s
+// REQUIRES: asserts
+// expected-no-diagnostics
+//
+// This test checks that the loop-widening code ignores static methods.  If that is not the
+// case, then an assertion will trigger.
+
+class Test {
+  static void foo() {
+    for (;;) {}
+  }
+};