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
