[analyzer] Add missing pre-post-statement callbacks for OffsetOfExpr.
This expression may or may not be evaluated in compile time, so tracking the result symbol is of potential interest. However, run-time offsetof is not yet supported by the analyzer, so for now this callback is only there to assist future implementation. Patch by Henry Wong! Differential Revision: https://reviews.llvm.org/D42300 llvm-svn: 324790
This commit is contained in:
parent
f3e09bdaee
commit
4b0d160a09
|
@ -33,6 +33,8 @@ class AnalysisOrderChecker
|
|||
check::PostStmt<ArraySubscriptExpr>,
|
||||
check::PreStmt<CXXNewExpr>,
|
||||
check::PostStmt<CXXNewExpr>,
|
||||
check::PreStmt<OffsetOfExpr>,
|
||||
check::PostStmt<OffsetOfExpr>,
|
||||
check::PreCall,
|
||||
check::PostCall,
|
||||
check::NewAllocator,
|
||||
|
@ -91,6 +93,16 @@ public:
|
|||
llvm::errs() << "PostStmt<CXXNewExpr>\n";
|
||||
}
|
||||
|
||||
void checkPreStmt(const OffsetOfExpr *OOE, CheckerContext &C) const {
|
||||
if (isCallbackEnabled(C, "PreStmtOffsetOfExpr"))
|
||||
llvm::errs() << "PreStmt<OffsetOfExpr>\n";
|
||||
}
|
||||
|
||||
void checkPostStmt(const OffsetOfExpr *OOE, CheckerContext &C) const {
|
||||
if (isCallbackEnabled(C, "PostStmtOffsetOfExpr"))
|
||||
llvm::errs() << "PostStmt<OffsetOfExpr>\n";
|
||||
}
|
||||
|
||||
void checkPreCall(const CallEvent &Call, CheckerContext &C) const {
|
||||
if (isCallbackEnabled(C, "PreCall")) {
|
||||
llvm::errs() << "PreCall";
|
||||
|
|
|
@ -1543,12 +1543,19 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
|
|||
Bldr.addNodes(Dst);
|
||||
break;
|
||||
|
||||
case Stmt::OffsetOfExprClass:
|
||||
case Stmt::OffsetOfExprClass: {
|
||||
Bldr.takeNodes(Pred);
|
||||
VisitOffsetOfExpr(cast<OffsetOfExpr>(S), Pred, Dst);
|
||||
ExplodedNodeSet PreVisit;
|
||||
getCheckerManager().runCheckersForPreStmt(PreVisit, Pred, S, *this);
|
||||
|
||||
ExplodedNodeSet PostVisit;
|
||||
for (ExplodedNode *Node : PreVisit)
|
||||
VisitOffsetOfExpr(cast<OffsetOfExpr>(S), Node, PostVisit);
|
||||
|
||||
getCheckerManager().runCheckersForPostStmt(Dst, PostVisit, S, *this);
|
||||
Bldr.addNodes(Dst);
|
||||
break;
|
||||
|
||||
}
|
||||
case Stmt::UnaryExprOrTypeTraitExprClass:
|
||||
Bldr.takeNodes(Pred);
|
||||
VisitUnaryExprOrTypeTraitExpr(cast<UnaryExprOrTypeTraitExpr>(S),
|
||||
|
|
|
@ -110,4 +110,6 @@ void _Exit(int status) __attribute__ ((__noreturn__));
|
|||
#ifndef NULL
|
||||
#define __DARWIN_NULL 0
|
||||
#define NULL __DARWIN_NULL
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define offsetof(t, d) __builtin_offsetof(t, d)
|
|
@ -0,0 +1,13 @@
|
|||
// RUN: %clang_analyze_cc1 -analyzer-checker=debug.AnalysisOrder -analyzer-config debug.AnalysisOrder:PreStmtOffsetOfExpr=true,debug.AnalysisOrder:PostStmtOffsetOfExpr=true %s 2>&1 | FileCheck %s
|
||||
#include "Inputs/system-header-simulator.h"
|
||||
|
||||
struct S {
|
||||
char c;
|
||||
};
|
||||
|
||||
void test() {
|
||||
offsetof(struct S, c);
|
||||
}
|
||||
|
||||
// CHECK: PreStmt<OffsetOfExpr>
|
||||
// CHECK-NEXT: PostStmt<OffsetOfExpr>
|
Loading…
Reference in New Issue