[PATCH PR45098] Disallow NULL pointer in pointer arithmetic

Tom de Vries vries@codesourcery.com
Thu Jun 16 18:10:00 GMT 2011


On 06/16/2011 05:42 PM, Zdenek Dvorak wrote:
>>>> diff -u gcc/tree-ssa-loop-niter.c (working copy) gcc/tree-ssa-loop-niter.c (working copy)
>>>> --- gcc/tree-ssa-loop-niter.c (working copy)
>>>> +++ gcc/tree-ssa-loop-niter.c (working copy)
>>>> @@ -2875,6 +2875,16 @@
>>>>    low = lower_bound_in_type (type, type);
>>>>    high = upper_bound_in_type (type, type);
>>>>
>>>> +  /* In C, pointer arithmetic p + 1 cannot use a NULL pointer, and p - 1 cannot
>>>> +     produce a NULL pointer.  The contrary would mean NULL points to an object,
>>>> +     while NULL is supposed to compare unequal with the address of all objects.
>>>> +     Furthermore, p + 1 cannot produce a NULL pointer and p - 1 cannot use a
>>>> +     NULL pointer since that would mean wrapping, which we assume here not to
>>>> +     happen.  So, we can exclude NULL from the valid range of pointer
>>>> +     arithmetic.  */
>>>> +  if (int_cst_value (low) == 0)
>>>> +    low = build_int_cstu (TREE_TYPE (low), TYPE_ALIGN_UNIT (TREE_TYPE (type)));
>>>> +
>>>>    record_nonwrapping_iv (loop, base, step, stmt, low, high, false, true);
>>>>  }
>>>
>>> OK,
>>
>> I think this is only valid for !flag_delete_null_pointer_checks, on
>> architectures where that isn't the default we have to assume that
>> NULL may point to an object.
> 
> agreed.  Thanks for the correction.
> 
> Zdenek

committed with test for flag_delete_null_pointer_checks added.

Thanks,
- Tom



More information about the Gcc-patches mailing list