[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