[cfe-commits] r81061 - in /cfe/trunk: include/clang/Analysis/PathSensitive/GRExprEngine.h lib/Analysis/GRExprEngine.cpp
Daniel Dunbar
daniel at zuster.org
Fri Sep 4 23:01:47 PDT 2009
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<xuzhongxing at gmail.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list