[cfe-commits] r66892 - in /cfe/trunk: include/clang/Analysis/PathSensitive/BasicValueFactory.h lib/Analysis/RegionStore.cpp test/Analysis/ptr-arith.c

Douglas Gregor dgregor at apple.com
Fri Mar 13 08:52:20 PDT 2009


On Mar 13, 2009, at 8:35 AM, Ted Kremenek wrote:

> Author: kremenek
> Date: Fri Mar 13 10:35:24 2009
> New Revision: 66892
>
> URL: http://llvm.org/viewvc/llvm-project?rev=66892&view=rev
> Log:
> Fix failure reported by Sebastian of test/Analysis/ptr-arith.c when  
> the target
> is 64-bit. I used his suggestion of doing a direct bitwidth/signedness
> conversion of the 'offset' instead of just changing the sign. For more
> information, see:

This kind of APSInt bitwidth/signedness problem has bitten us several  
times in several places, which makes me think that there are more of  
such problems lurking. Perhaps we should put a layer of abstraction  
over APSInt that automatically widens or sign-corrects when performing  
the various arithmetic and comparison operations?

	- Doug

> http://lists.cs.uiuc.edu/pipermail/cfe-dev/2009-March/004587.html
>
> Modified:
>    cfe/trunk/include/clang/Analysis/PathSensitive/BasicValueFactory.h
>    cfe/trunk/lib/Analysis/RegionStore.cpp
>    cfe/trunk/test/Analysis/ptr-arith.c
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/ 
> BasicValueFactory.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/BasicValueFactory.h?rev=66892&r1=66891&r2=66892&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/ 
> BasicValueFactory.h (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/ 
> BasicValueFactory.h Fri Mar 13 10:35:24 2009
> @@ -76,16 +76,18 @@
>   const llvm::APSInt& getValue(uint64_t X, unsigned BitWidth, bool  
> isUnsigned);
>   const llvm::APSInt& getValue(uint64_t X, QualType T);
>
> -  const llvm::APSInt& ConvertSignedness(const llvm::APSInt& To,
> -                                        const llvm::APSInt& From) {
> -    assert(To.getBitWidth() == From.getBitWidth());
> -
> -    // Same sign?  Just return.
> -    if (To.isUnsigned() == From.isUnsigned())
> +  /// Convert - Create a new persistent APSInt with the same value  
> as 'From'
> +  ///  but with the bitwidth and signeness of 'To'.
> +  const llvm::APSInt& Convert(const llvm::APSInt& To,
> +                              const llvm::APSInt& From) {
> +
> +    if (To.isUnsigned() == From.isUnsigned() &&
> +        To.getBitWidth() == From.getBitWidth())
>       return From;
>
> -    // Convert!
> -    return getValue(llvm::APSInt((llvm::APInt&) From, To.isUnsigned 
> ()));
> +    return getValue(From.getSExtValue(),
> +                    To.getBitWidth(),
> +                    To.isUnsigned());
>   }
>
>   const llvm::APSInt& getIntValue(uint64_t X, bool isUnsigned) {
>
> Modified: cfe/trunk/lib/Analysis/RegionStore.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/RegionStore.cpp?rev=66892&r1=66891&r2=66892&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/RegionStore.cpp (original)
> +++ cfe/trunk/lib/Analysis/RegionStore.cpp Fri Mar 13 10:35:24 2009
> @@ -642,12 +642,13 @@
>
>   // Only support concrete integer indexes for now.
>   if (Base && Offset) {
> -    // For now, convert the signedness of offset in case it doesn't  
> match.
> -    const llvm::APSInt &I =
> -      getBasicVals().ConvertSignedness(Base->getValue(), Offset- 
> >getValue());
> -    nonloc::ConcreteInt OffsetConverted(I);
> -
> -    SVal NewIdx = Base->EvalBinOp(getBasicVals(), Op,  
> OffsetConverted);
> +    // FIXME: For now, convert the signedness and bitwidth of  
> offset in case
> +    //  they don't match.  This can result from pointer  
> arithmetic.  In reality,
> +    //  we should figure out what are the proper semantics and  
> implement them.
> +    //
> +    nonloc::ConcreteInt OffConverted(getBasicVals().Convert(Base- 
> >getValue(),
> +                                                           Offset- 
> >getValue()));
> +    SVal NewIdx = Base->EvalBinOp(getBasicVals(), Op, OffConverted);
>     const MemRegion* NewER = MRMgr.getElementRegion(NewIdx,
>                                                     ER- 
> >getArrayRegion());
>     return Loc::MakeVal(NewER);
>
> Modified: cfe/trunk/test/Analysis/ptr-arith.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/ptr-arith.c?rev=66892&r1=66891&r2=66892&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/test/Analysis/ptr-arith.c (original)
> +++ cfe/trunk/test/Analysis/ptr-arith.c Fri Mar 13 10:35:24 2009
> @@ -1,4 +1,6 @@
> -// RUN: clang -analyze -checker-simple -analyzer-store=region - 
> verify %s
> +// RUN: clang -analyze -checker-simple -analyzer-store=region - 
> verify %s &&
> +// RUN: clang -analyze -checker-cfref -analyzer-store=region - 
> verify -triple x86_64-apple-darwin9 %s &&
> +// RUN: clang -analyze -checker-cfref -analyzer-store=region - 
> verify -triple i686-apple-darwin9 %s
>
> void f1() {
>   int a[10];
>
>
> _______________________________________________
> 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