[PATCH][Middle-end]79538 missing -Wformat-overflow with %s and non-member array arguments
Martin Sebor
msebor@gmail.com
Tue Dec 12 22:58:00 GMT 2017
On 12/12/2017 10:56 AM, Qing Zhao wrote:
> Hi, Martin,
>
> thanks for the suggestion, this might be a good enhancement for
> get_range_strlen for a future work.
>
> my understanding is, the current get_range_strlen does not use value
> range info yet, and also does not handle VLA.
> we can improve it from both aspects in a later work.
I agree (that's also what I meant). Your patch is a valuable
improvement in and of itself.
Martin
>
> Qing
>
>>>
>>> Per your comments, the updated gimple-fold.c is like the following:
>>
>> FWIW, I suspect Richard is thinking of VLAs with the INTEGER_CST
>> comment above. This is the case we discussed in private. It is
>> handled either way but the handling could be improved by determining
>> the size of the VLA from the first __builtin_alloca_with_align
>> argument and using it or its range as the minimum and maximum.
>> With that, the range of string lengths that fit in vla in
>> the following could be determined and the sprintf call could
>> be diagnosed:
>>
>> char d[30];
>>
>> void f (unsigned n)
>> {
>> if (n < 32)
>> {
>> char vla[n];
>> __builtin_sprintf (d, "%s", vla);
>> }
>> }
>>
>> I think this would be a nice enhancement to add on top of yours,
>> not just for VLAs but for dynamically allocated arrays as well,
>> and not just for the sprintf pass but also for the strlen pass
>> to optimize cases like:
>>
>> void f (unsigned n)
>> {
>> if (n < 32)
>> {
>> char vla[n];
>>
>> fgets (vla, n, stdin);
>>
>> unsigned len = strlen (vla);
>> if (len >= n) // cannot hold
>> abort (); // can be eliminated
>> }
>> }
>>
>> That said, at some point, it might make more sense to change
>> those passes to start tracking these things as they traverse
>> the CFG rather than having get_range_strlen() do the work.
>>
>> Martin
>>
>>>
>>> diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
>>> index 353a46e..0500fba 100644
>>> --- a/gcc/gimple-fold.c
>>> +++ b/gcc/gimple-fold.c
>>> @@ -1323,6 +1323,19 @@ get_range_strlen (tree arg, tree length[2],
>>> bitmap *visited, int type,
>>> the array could have zero length. */
>>> *minlen = ssize_int (0);
>>> }
>>> +
>>> + if (VAR_P (arg)
>>> + && TREE_CODE (TREE_TYPE (arg)) == ARRAY_TYPE)
>>> + {
>>> + val = TYPE_SIZE_UNIT (TREE_TYPE (arg));
>>> + if (!val || TREE_CODE (val) != INTEGER_CST ||
>>> integer_zerop (val))
>>> + return false;
>>> + val = fold_build2 (MINUS_EXPR, TREE_TYPE (val), val,
>>> + build_int_cst (TREE_TYPE (val), 1));
>>> + /* Set the minimum size to zero since the string in
>>> + the array could have zero length. */
>>> + *minlen = ssize_int (0);
>>> + }
>>> }
>>>
>>> if (!val)
>>>
>>> let me know any further issue with the above.
>>>
>>> thanks a lot.
>>>
>>> Qing
>
More information about the Gcc-patches
mailing list