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

Ted Kremenek kremenek at apple.com
Thu Jan 21 22:30:49 PST 2010


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).

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