From: Ted Kremenek Date: Fri, 28 Sep 2007 21:08:51 +0000 (+0000) Subject: Fixed UninitializedValues to properly propagate uninitialized "taint" X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6ce2b630652911c5b463ce0203855b1eaf4694bd;p=clang Fixed UninitializedValues to properly propagate uninitialized "taint" in assignment operations of the form +=, -=, *=, etc. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42449 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Analysis/UninitializedValues.cpp b/Analysis/UninitializedValues.cpp index a7c7ccbc1d..58b95fcffb 100644 --- a/Analysis/UninitializedValues.cpp +++ b/Analysis/UninitializedValues.cpp @@ -106,10 +106,20 @@ BlockVarDecl* TransferFuncs::FindBlockVarDecl(Stmt *S) { } bool TransferFuncs::VisitBinaryOperator(BinaryOperator* B) { - if (B->isAssignmentOp()) - if (BlockVarDecl* VD = FindBlockVarDecl(B->getLHS())) - return V(VD,AD) = AD.FullUninitTaint ? Visit(B->getRHS()) : Initialized; - + if (BlockVarDecl* VD = FindBlockVarDecl(B->getLHS())) + if (B->isAssignmentOp()) { + if (AD.FullUninitTaint) { + if (B->getOpcode() == BinaryOperator::Assign) + return V(VD,AD) = Visit(B->getRHS()); + else // Handle +=, -=, *=, etc. We do want '&', not '&&'. + return V(VD,AD) = Visit(B->getLHS()) & Visit(B->getRHS()); + } + else { + Visit(B->getLHS()); Visit(B->getRHS()); + return Initialized; + } + } + return VisitStmt(B); }