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.

@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