Fixed in r81066 On Sat, Sep 5, 2009 at 2:01 PM, Daniel Dunbar<[email protected]> wrote: > Hi Zhongxing, > > These tests are failing as of this commit: > /Users/buildslave/zorg/smooshlab/slaves/clang/build.clang-i386-darwin9/llvm/tools/clang/test/Analysis/array-struct.c > /Users/buildslave/zorg/smooshlab/slaves/clang/build.clang-i386-darwin9/llvm/tools/clang/test/Analysis/null-deref-ps.c > > Can you take a look? > > - Daniel > > On Fri, Sep 4, 2009 at 10:00 PM, Zhongxing Xu<[email protected]> wrote: >> Author: zhongxingxu >> Date: Sat Sep 5 00:00:57 2009 >> New Revision: 81061 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=81061&view=rev >> Log: >> Refactor builtin function evaluation code into its own function. >> >> Modified: >> cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h >> cfe/trunk/lib/Analysis/GRExprEngine.cpp >> >> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h?rev=81061&r1=81060&r2=81061&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h (original) >> +++ cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h Sat Sep 5 >> 00:00:57 2009 >> @@ -578,6 +578,9 @@ >> SVal EvalComplement(SVal X) { >> return X.isValid() ? SVator.EvalComplement(cast<NonLoc>(X)) : X; >> } >> + >> + bool EvalBuiltinFunction(const FunctionDecl *FD, CallExpr *CE, >> + ExplodedNode *Pred, ExplodedNodeSet &Dst); >> >> public: >> >> >> Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=81061&r1=81060&r2=81061&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original) >> +++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Sat Sep 5 00:00:57 2009 >> @@ -1503,6 +1503,46 @@ >> } >> } >> >> +bool GRExprEngine::EvalBuiltinFunction(const FunctionDecl *FD, CallExpr *CE, >> + ExplodedNode *Pred, >> + ExplodedNodeSet &Dst) { >> + if (!FD) >> + return false; >> + >> + unsigned id = FD->getBuiltinID(getContext()); >> + if (!id) >> + return false; >> + >> + const GRState *state = Pred->getState(); >> + >> + switch (id) { >> + case Builtin::BI__builtin_expect: { >> + // For __builtin_expect, just return the value of the subexpression. >> + assert (CE->arg_begin() != CE->arg_end()); >> + SVal X = state->getSVal(*(CE->arg_begin())); >> + MakeNode(Dst, CE, Pred, state->BindExpr(CE, X)); >> + return true; >> + } >> + >> + case Builtin::BI__builtin_alloca: { >> + // FIXME: Refactor into StoreManager itself? >> + MemRegionManager& RM = getStateManager().getRegionManager(); >> + const MemRegion* R = >> + RM.getAllocaRegion(CE, Builder->getCurrentBlockCount()); >> + >> + // Set the extent of the region in bytes. This enables us to use the >> + // SVal of the argument directly. If we save the extent in bits, we >> + // cannot represent values like symbol*8. >> + SVal Extent = state->getSVal(*(CE->arg_begin())); >> + state = getStoreManager().setExtent(state, R, Extent); >> + MakeNode(Dst, CE, Pred, state->BindExpr(CE, loc::MemRegionVal(R))); >> + return true; >> + } >> + } >> + >> + return false; >> +} >> + >> void GRExprEngine::EvalCall(ExplodedNodeSet& Dst, CallExpr* CE, SVal L, >> ExplodedNode* Pred) { >> assert (Builder && "GRStmtNodeBuilder must be defined."); >> @@ -1571,7 +1611,8 @@ >> } >> >> // Finally, evaluate the function call. >> - for (ExplodedNodeSet::iterator DI = DstTmp.begin(), DE = DstTmp.end(); >> DI!=DE; ++DI) { >> + for (ExplodedNodeSet::iterator DI = DstTmp.begin(), DE = DstTmp.end(); >> + DI != DE; ++DI) { >> >> const GRState* state = GetState(*DI); >> SVal L = state->getSVal(Callee); >> @@ -1587,38 +1628,8 @@ >> MarkNoReturnFunction(FD, CE, state, Builder); >> >> // Evaluate the call. >> - >> - if (FD) { >> - >> - if (unsigned id = FD->getBuiltinID(getContext())) >> - switch (id) { >> - case Builtin::BI__builtin_expect: { >> - // For __builtin_expect, just return the value of the >> subexpression. >> - assert (CE->arg_begin() != CE->arg_end()); >> - SVal X = state->getSVal(*(CE->arg_begin())); >> - MakeNode(Dst, CE, *DI, state->BindExpr(CE, X)); >> - continue; >> - } >> - >> - case Builtin::BI__builtin_alloca: { >> - // FIXME: Refactor into StoreManager itself? >> - MemRegionManager& RM = getStateManager().getRegionManager(); >> - const MemRegion* R = >> - RM.getAllocaRegion(CE, Builder->getCurrentBlockCount()); >> - >> - // Set the extent of the region in bytes. This enables us to >> use the >> - // SVal of the argument directly. If we save the extent in >> bits, we >> - // cannot represent values like symbol*8. >> - SVal Extent = state->getSVal(*(CE->arg_begin())); >> - state = getStoreManager().setExtent(state, R, Extent); >> - MakeNode(Dst, CE, *DI, state->BindExpr(CE, >> loc::MemRegionVal(R))); >> - continue; >> - } >> - >> - default: >> - break; >> - } >> - } >> + if (EvalBuiltinFunction(FD, CE, Pred, Dst)) >> + continue; >> >> // Dispatch to the plug-in transfer function. >> >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
