[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