mirror of https://github.com/microsoft/clang.git
[analyzer] Avoid querying this-pointers for static-methods.
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
This commit is contained in:
parent
3817323bb7
commit
50ab044c0e
|
@ -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);
|
||||
|
|
|
@ -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 (;;) {}
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue