Added basic psuedoconstant checking in IdempotentOperationChecker and fixed some test cases.

llvm-svn: 111190
This commit is contained in:
Tom Care 2010-08-16 21:43:52 +00:00
parent e85c619980
commit c129cc18f0
2 changed files with 20 additions and 4 deletions

View File

@ -81,6 +81,7 @@ class IdempotentOperationChecker
const CFGBlock *CB,
const GRCoreEngine &CE);
static bool CanVary(const Expr *Ex, ASTContext &Ctx);
static bool isPseudoConstant(const DeclRefExpr *D);
// Hash table
typedef llvm::DenseMap<const BinaryOperator *,
@ -530,8 +531,7 @@ bool IdempotentOperationChecker::CanVary(const Expr *Ex, ASTContext &Ctx) {
return SE->getTypeOfArgument()->isVariableArrayType();
}
case Stmt::DeclRefExprClass:
// return !IsPseudoConstant(cast<DeclRefExpr>(Ex));
return true;
return !isPseudoConstant(cast<DeclRefExpr>(Ex));
// The next cases require recursion for subexpressions
case Stmt::BinaryOperatorClass: {
@ -555,3 +555,17 @@ bool IdempotentOperationChecker::CanVary(const Expr *Ex, ASTContext &Ctx) {
}
}
// Returns true if a DeclRefExpr behaves like a constant.
bool IdempotentOperationChecker::isPseudoConstant(const DeclRefExpr *DR) {
// Check for an enum
if (isa<EnumConstantDecl>(DR->getDecl()))
return true;
// Check for a static variable
// FIXME: Analysis should model static vars
if (const VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl()))
if (VD->isStaticLocal())
return true;
return false;
}

View File

@ -74,12 +74,14 @@ void bailout() {
// False positive tests
unsigned false1() {
return (5 - 2 - 3); // no-warning
int a = 10;
return a * (5 - 2 - 3); // no-warning
}
enum testenum { enum1 = 0, enum2 };
unsigned false2() {
return enum1; // no-warning
int a = 1234;
return enum1 + a; // no-warning
}
extern unsigned foo();