From: Tom Care Date: Tue, 7 Sep 2010 20:27:56 +0000 (+0000) Subject: Re-enabled truncation/extension checking in IdempotentOperationChecker and added... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=84c24ed29e0bb37fc06a584e0df5bdfbe49efc8f;p=clang Re-enabled truncation/extension checking in IdempotentOperationChecker and added a test case. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113269 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Checker/IdempotentOperationChecker.cpp b/lib/Checker/IdempotentOperationChecker.cpp index 6411c790ef..2e85013a76 100644 --- a/lib/Checker/IdempotentOperationChecker.cpp +++ b/lib/Checker/IdempotentOperationChecker.cpp @@ -78,8 +78,8 @@ class IdempotentOperationChecker // False positive reduction methods static bool isSelfAssign(const Expr *LHS, const Expr *RHS); static bool isUnused(const Expr *E, AnalysisContext *AC); - //static bool isTruncationExtensionAssignment(const Expr *LHS, - // const Expr *RHS); + static bool isTruncationExtensionAssignment(const Expr *LHS, + const Expr *RHS); static bool PathWasCompletelyAnalyzed(const CFG *C, const CFGBlock *CB, const GRCoreEngine &CE); @@ -196,9 +196,10 @@ void IdempotentOperationChecker::PreVisitBinaryOperator( case BO_Assign: // x Assign x can be used to silence unused variable warnings intentionally. // If this is a self assignment and the variable is referenced elsewhere, - // then it is a false positive. + // and the assignment is not a truncation or extension, then it is a false + // positive. if (isSelfAssign(LHS, RHS)) { - if (!isUnused(LHS, AC)) { + if (!isUnused(LHS, AC) && !isTruncationExtensionAssignment(LHS, RHS)) { UpdateAssumption(A, Equal); return; } @@ -500,7 +501,6 @@ bool IdempotentOperationChecker::isUnused(const Expr *E, return true; } -#if 0 // Check for self casts truncating/extending a variable bool IdempotentOperationChecker::isTruncationExtensionAssignment( const Expr *LHS, @@ -523,7 +523,6 @@ bool IdempotentOperationChecker::isTruncationExtensionAssignment( return dyn_cast(RHS->IgnoreParens()) == NULL; } -#endif // Returns false if a path to this block was not completely analyzed, or true // otherwise. diff --git a/test/Analysis/idempotent-operations.c b/test/Analysis/idempotent-operations.c index 5c9a59d736..d88bf49485 100644 --- a/test/Analysis/idempotent-operations.c +++ b/test/Analysis/idempotent-operations.c @@ -187,3 +187,10 @@ int false7() { return a; } + +// Check truncations do not flag as self-assignments +void false8() { + int a = 10000000; + a = (short)a; // no-warning + test(a); +}