[cfe-commits] r85462 - /cfe/trunk/test/Analysis/misc-ps-eager-assume.m

Ted Kremenek kremenek at apple.com
Mon Nov 2 18:54:43 PST 2009


The file contains both C and Objective-C test cases.  No need to split  
it into a separate C file.

On Oct 28, 2009, at 5:53 PM, Fariborz Jahanian wrote:

> Why is this an objective-c test case? Problem seems to be a c issue.
>
> - Fariborz
>
> On Oct 28, 2009, at 5:49 PM, Ted Kremenek wrote:
>
>> Author: kremenek
>> Date: Wed Oct 28 19:49:46 2009
>> New Revision: 85462
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=85462&view=rev
>> Log:
>> Add test case for <rdar://problem/7342806>.
>>
>> Modified:
>>   cfe/trunk/test/Analysis/misc-ps-eager-assume.m
>>
>> Modified: cfe/trunk/test/Analysis/misc-ps-eager-assume.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-ps-eager-assume.m?rev=85462&r1=85461&r2=85462&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> = 
>> =====================================================================
>> --- cfe/trunk/test/Analysis/misc-ps-eager-assume.m (original)
>> +++ cfe/trunk/test/Analysis/misc-ps-eager-assume.m Wed Oct 28  
>> 19:49:46 2009
>> @@ -77,3 +77,46 @@
>>  *a = 1; // no-warning
>>  *b = 1; // no-warning
>> }
>> +
>> +
>> +// 
>> = 
>> = 
>> = 
>> ---------------------------------------------------------------------= 
>> ==//
>> +// <rdar://problem/7342806>
>> +// This false positive occured because the symbolic constraint on  
>> a short was
>> +// not maintained via sign extension.  The analyzer doesn't  
>> properly handle
>> +// the sign extension, but now tracks the constraint.  This  
>> particular
>> +// case relies on -analyzer-eagerly-assume because of the expression
>> +// 'Flag1 != Count > 0'.
>> +// 
>> = 
>> = 
>> = 
>> ---------------------------------------------------------------------= 
>> ==//
>> +
>> +void rdar7342806_aux(short x);
>> +
>> +void rdar7342806() {
>> +  extern short Count;
>> +  extern short Flag1;
>> +
>> +  short *Pointer = 0;
>> +  short  Flag2   = !!Pointer;   // Flag2 is false (0).
>> +  short  Ok      = 1;
>> +  short  Which;
>> +
>> +  if( Flag1 != Count > 0 )
>> +    // Static analyzer skips this so either
>> +    //   Flag1 is true and Count > 0
>> +    // or
>> +    //   Flag1 is false and Count <= 0
>> +    Ok = 0;
>> +
>> +  if( Flag1 != Flag2 )
>> +    // Analyzer skips this so Flag1 and Flag2 have the
>> +    // same value, both are false because Flag2 is false. And
>> +    // from that we know Count must be <= 0.
>> +    Ok = 0;
>> +
>> +  for( Which = 0;
>> +         Which < Count && Ok;
>> +           Which++ )
>> +    // This statement can only execute if Count > 0 which can only
>> +    // happen when Flag1 and Flag2 are both true and Flag2 will only
>> +    // be true when Pointer is not NULL.
>> +    rdar7342806_aux(*Pointer); // no-warning
>> +}
>>
>>
>> _______________________________________________
>> 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