[cfe-commits] r94153 - in /cfe/trunk: include/clang/Analysis/PathSensitive/GRExprEngine.h lib/Analysis/GRExprEngine.cpp

Zhongxing Xu xuzhongxing at gmail.com
Thu Jan 21 23:26:06 PST 2010


2010/1/22 Ted Kremenek <kremenek at apple.com>:
> Hi Zhongxing,
>
> Is the "default" case need?  I'd rather just enumerate all the cases and start with reasonable default behavior than have a default case with an assertion (which would be caught at runtime with a crash instead of at compile time).

I think both are equivalent. We could put all cases under the current
handling. But some of them may still cause crash. I put them in a
default case to remind us that they have not been really considered by
us.

>
> Ted
>
> On Jan 21, 2010, at 8:30 PM, Zhongxing Xu wrote:
>
>> Author: zhongxingxu
>> Date: Thu Jan 21 22:30:00 2010
>> New Revision: 94153
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=94153&view=rev
>> Log:
>> Process cast according to the cast kind. Prepare for more specific cast
>> handling (for C++). No functionality change for now.
>>
>> 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=94153&r1=94152&r2=94153&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h (original)
>> +++ cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h Thu Jan 21 22:30:00 2010
>> @@ -270,8 +270,8 @@
>>                  ExplodedNodeSet& Dst, bool asLValue);
>>
>>   /// VisitCast - Transfer function logic for all casts (implicit and explicit).
>> -  void VisitCast(Expr* CastE, Expr* Ex, ExplodedNode* Pred,
>> -                 ExplodedNodeSet& Dst, bool asLValue);
>> +  void VisitCast(CastExpr *CastE, Expr *Ex, ExplodedNode *Pred,
>> +                 ExplodedNodeSet &Dst, bool asLValue);
>>
>>   /// VisitCompoundLiteralExpr - Transfer function logic for compound literals.
>>   void VisitCompoundLiteralExpr(CompoundLiteralExpr* CL, ExplodedNode* Pred,
>>
>> Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=94153&r1=94152&r2=94153&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
>> +++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Thu Jan 21 22:30:00 2010
>> @@ -2173,8 +2173,8 @@
>> // Transfer functions: Miscellaneous statements.
>> //===----------------------------------------------------------------------===//
>>
>> -void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, ExplodedNode* Pred,
>> -                             ExplodedNodeSet& Dst, bool asLValue){
>> +void GRExprEngine::VisitCast(CastExpr *CastE, Expr *Ex, ExplodedNode *Pred,
>> +                             ExplodedNodeSet &Dst, bool asLValue) {
>>   ExplodedNodeSet S1;
>>   QualType T = CastE->getType();
>>   QualType ExTy = Ex->getType();
>> @@ -2191,14 +2191,6 @@
>>   ExplodedNodeSet S2;
>>   CheckerVisit(CastE, S2, S1, true);
>>
>> -  // Check for casting to "void".
>> -  if (T->isVoidType()) {
>> -    assert(!asLValue);
>> -    for (ExplodedNodeSet::iterator I = S2.begin(), E = S2.end(); I != E; ++I)
>> -      Dst.Add(*I);
>> -    return;
>> -  }
>> -
>>   // If we are evaluating the cast in an lvalue context, we implicitly want
>>   // the cast to evaluate to a location.
>>   if (asLValue) {
>> @@ -2207,13 +2199,51 @@
>>     ExTy = Ctx.getPointerType(Ctx.getCanonicalType(ExTy));
>>   }
>>
>> -  for (ExplodedNodeSet::iterator I = S2.begin(), E = S2.end(); I != E; ++I) {
>> -    ExplodedNode* N = *I;
>> -    const GRState* state = GetState(N);
>> -    SVal V = state->getSVal(Ex);
>> -    const SValuator::CastResult &Res = SVator.EvalCast(V, state, T, ExTy);
>> -    state = Res.getState()->BindExpr(CastE, Res.getSVal());
>> -    MakeNode(Dst, CastE, N, state);
>> +  switch (CastE->getCastKind()) {
>> +  case CastExpr::CK_ToVoid:
>> +    assert(!asLValue);
>> +    for (ExplodedNodeSet::iterator I = S2.begin(), E = S2.end(); I != E; ++I)
>> +      Dst.Add(*I);
>> +    return;
>> +
>> +  case CastExpr::CK_NoOp:
>> +  case CastExpr::CK_FunctionToPointerDecay:
>> +    for (ExplodedNodeSet::iterator I = S2.begin(), E = S2.end(); I != E; ++I) {
>> +      // Copy the SVal of Ex to CastE.
>> +      ExplodedNode *N = *I;
>> +      const GRState *state = GetState(N);
>> +      SVal V = state->getSVal(Ex);
>> +      state = state->BindExpr(CastE, V);
>> +      MakeNode(Dst, CastE, N, state);
>> +    }
>> +    return;
>> +
>> +  case CastExpr::CK_Unknown:
>> +  case CastExpr::CK_ArrayToPointerDecay:
>> +  case CastExpr::CK_BitCast:
>> +  case CastExpr::CK_IntegralCast:
>> +  case CastExpr::CK_IntegralToPointer:
>> +  case CastExpr::CK_PointerToIntegral:
>> +  case CastExpr::CK_IntegralToFloating:
>> +  case CastExpr::CK_FloatingToIntegral:
>> +  case CastExpr::CK_FloatingCast:
>> +  case CastExpr::CK_AnyPointerToObjCPointerCast:
>> +  case CastExpr::CK_AnyPointerToBlockPointerCast:
>> +  case CastExpr::CK_DerivedToBase:
>> +    // Delegate to SValuator to process.
>> +    for (ExplodedNodeSet::iterator I = S2.begin(), E = S2.end(); I != E; ++I) {
>> +      ExplodedNode* N = *I;
>> +      const GRState* state = GetState(N);
>> +      SVal V = state->getSVal(Ex);
>> +      const SValuator::CastResult &Res = SVator.EvalCast(V, state, T, ExTy);
>> +      state = Res.getState()->BindExpr(CastE, Res.getSVal());
>> +      MakeNode(Dst, CastE, N, state);
>> +    }
>> +    return;
>> +
>> +  default:
>> +    llvm::errs() << "Cast kind " << CastE->getCastKind() << " not handled.\n";
>> +    assert(0);
>>   }
>> }
>>
>>
>>
>> _______________________________________________
>> 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