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