[cfe-commits] r81061 - in /cfe/trunk: include/clang/Analysis/PathSensitive/GRExprEngine.h lib/Analysis/GRExprEngine.cpp
Zhongxing Xu
xuzhongxing at gmail.com
Fri Sep 4 23:48:01 PDT 2009
Fixed in r81066
On Sat, Sep 5, 2009 at 2:01 PM, Daniel Dunbar<daniel at zuster.org> 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<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