[cfe-commits] r74408 - in /cfe/trunk: lib/Analysis/CFRefCount.cpp test/Analysis/array-struct.c

Ted Kremenek kremenek at apple.com
Tue Jun 30 12:59:26 PDT 2009


Hi Zhongxing,

First, I think all of this logic for region invalidation is great.

Second, I think we should start considering placing (some or all of)  
this logic elsewhere, e.g., in StoreManager.  This will allow us to  
separate "policy" (when to invalidate) from "action" (invalidation).   
This seems natural as value invalidation seems like the task of  
StoreManager, and much of the control-logic here hopefully won't stay  
in CFRefCounts.cpp.

What do you think?  As a part of invalidating regions, checker- 
specific logic may wish to know when a region gets invalidated, e.g.,  
so it can stop tracking an object's reference counts, etc.  This can  
probably be done via callbacks.

On Jun 28, 2009, at 6:59 AM, Zhongxing Xu wrote:

> Author: zhongxingxu
> Date: Sun Jun 28 08:59:24 2009
> New Revision: 74408
>
> URL: http://llvm.org/viewvc/llvm-project?rev=74408&view=rev
> Log:
> Invalidate a field of struct type by setting its default value to  
> conjured
> symbol.
>
> Modified:
>    cfe/trunk/lib/Analysis/CFRefCount.cpp
>    cfe/trunk/test/Analysis/array-struct.c
>
> Modified: cfe/trunk/lib/Analysis/CFRefCount.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=74408&r1=74407&r2=74408&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)
> +++ cfe/trunk/lib/Analysis/CFRefCount.cpp Sun Jun 28 08:59:24 2009
> @@ -2863,14 +2863,25 @@
>                 // For now just handle scalar fields.
>                 FieldDecl *FD = *FI;
>                 QualType FT = FD->getType();
> -
> +                const FieldRegion* FR = MRMgr.getFieldRegion(FD, R);
> +
>                 if (Loc::IsLocType(FT) ||
>                     (FT->isIntegerType() && FT->isScalarType())) {
> -                  const FieldRegion* FR = MRMgr.getFieldRegion(FD,  
> R);
> -
>                   SVal V = ValMgr.getConjuredSymbolVal(*I, FT, Count);
>                   state = state->bindLoc(ValMgr.makeLoc(FR), V);
> -                }
> +                }
> +                else if (FT->isStructureType()) {
> +                  // set the default value of the struct field to  
> conjured
> +                  // symbol. Note that the type of the symbol is  
> irrelavant.
> +                  // We cannot use the type of the struct otherwise  
> ValMgr won't
> +                  // give us the conjured symbol.
> +                  StoreManager& StoreMgr =
> +                    Eng.getStateManager().getStoreManager();
> +                  SVal V = ValMgr.getConjuredSymbolVal(*I,
> +                                                        
> Eng.getContext().IntTy,
> +                                                       Count);
> +                  state = StoreMgr.setDefaultValue(state, FR, V);
> +                }
>               }
>             } else if (const ArrayType *AT = Ctx.getAsArrayType(T)) {
>               // Set the default value of the array to conjured  
> symbol.
>
> Modified: cfe/trunk/test/Analysis/array-struct.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/array-struct.c?rev=74408&r1=74407&r2=74408&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/test/Analysis/array-struct.c (original)
> +++ cfe/trunk/test/Analysis/array-struct.c Sun Jun 28 08:59:24 2009
> @@ -157,3 +157,14 @@
> void f16(struct s3 *p) {
>   struct s3 a = *((struct s3*) ((char*) &p[0]));
> }
> +
> +void inv(struct s1 *);
> +
> +// Invalidate the struct field.
> +void f17() {
> +  struct s1 t;
> +  int x;
> +  inv(&t);
> +  if (t.e.d)
> +    x = 1;
> +}
>
>
> _______________________________________________
> 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