Skip to content

Commit

Permalink
[analyzer] Avoid querying this-pointers for static-methods.
Browse files Browse the repository at this point in the history
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

llvm-svn: 339201
  • Loading branch information
Matt Davis authored and Matt Davis committed Aug 7, 2018
1 parent bac052e commit 95dd80c
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 2 deletions.
6 changes: 4 additions & 2 deletions clang/lib/StaticAnalyzer/Core/LoopWidening.cpp
Expand Up @@ -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);
Expand Down
12 changes: 12 additions & 0 deletions clang/test/Analysis/loop-widening-ignore-static-methods.cpp
@@ -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 (;;) {}
}
};

0 comments on commit 95dd80c

Please sign in to comment.