On 2/15/19 7:22 AM, Julia Lawall wrote:
>
>
> On Thu, 14 Feb 2019, Michael Stefaniuc wrote:
>
>> On 2/14/19 10:38 PM, Julia Lawall wrote:
>>>
>>>
>>> On Thu, 14 Feb 2019, Michael Stefaniuc wrote:
>>>
>>>> Hello,
>>>>
>>>> I have this trivial script to remove useless casts to self:
>>>> @ disable drop_cast @
>>>> type T;
>>>> T E;
>>>> @@
>>>> - (T)
>>>> E
>>>>
>>>> It works but I'm hitting false positives when the code casts away
>>>> qualifiers for field types. Please see the attached test case:
>>>> - Good: Cast is kept in foo()
>>>> - Bad: Cast is dropped in baz()
>>>>
>>>> Applying the generated diff will lead to a gcc warning:
>>>> $ gcc -c qualifier.c
>>>> qualifier.c: In function ‘baz’:
>>>> qualifier.c:12:12: warning: return discards ‘const’ qualifier from
>>>> pointer target type [-Wdiscarded-qualifiers]
>>>> return &b->i;
>>>> ^~~~~
>>>>
>>>> I tried disabling the optional_qualifier iso but that has no effect:
>>>> - Not needed for the foo() case
>>>> - No effect for the baz() case
>>>>
>>>> I even tried prepending an alternation with "const T good;" but the cast
>>>> still gets removed.
>>>
>>> The following is better, but not perfect, in that it requires that the
>>> const thing have type pointer to a structure. It could be possible to
>>> explicitly consider more type patterns.
>> Well, it doesn't fixes the problem that the qualifier is not propagated
>> from the struct to its fields. Code like this isn't matched with or
>> without the cocci modification.
>>
>> const int *zzz(const struct bar *b)
>> {
>> return (const int *)&b->i;
>> }
>>
>> That's because "&b->i" has the type of just "int*" instead of the
>> correct "const int*".
>
> OK. I can change it in the way that is suggested. In the short term, you
> can add another case to the disjunction, ie - (const T), to reduce the
> number of false positives.
Thanks!
I just wanted to report the bug, there's no urgency whatsoever.
After all this is just janitorial work, I'm sure the casts will wait for
me a few more years ;)
bye
michael
>>>
>>> @disable drop_cast@
>>> type T,T1;
>>> T E;
>>> identifier i;
>>> const struct i *c;
>>> @@
>>>
>>> (
>>> c
>>> |
>>> - (T)
>>> E
>>> )
>>>
>>> julia
>>>
>>
>>
>
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci