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
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci

Reply via email to