cocci: remove unnecessary casts of void * while avoiding casts with __user or __force ?
A simple cocci script that removes unnecessary casts of a void * will also remove casts with __force or __user
e.g.:
-???????xemaclite_aligned_write(address_ptr, (u32 __force *) addr, ETH_ALEN); +???????xemaclite_aligned_write(address_ptr, addr, ETH_ALEN);
Is there a simple mechanism to avoid converting those?
$ cat void.cocci @@ type T; void *v; expression e; @@
- e = (T *)v;
+ e = v;
@@
identifier f;
type T;
void *v;
@@
f(..., - (T *)v, + v, ...)
$
Quoted 2 lines · Joe Perches
A simple cocci script that removes unnecessary casts of a void * will also remove casts with
__forceor__user
Unfortunately, attributes are currently not supported inside casts. This can be done in a hackish way (possible false negatives) as follows:
---
@initialize:ocaml@
@@
let close (p1,p2) =
let r = (List.hd p1).line_end in
let l = (List.hd p2).line in
let rc = (List.hd p1).col_end in
let lc = (List.hd p2).col in
r = l && lc = rc+1
@r@
position p1,p2;
expression f,e;
type T;
@@
f(..., // generalize this rule as needed
(T at p1 *@p2)
e,...)
@@
position r.p2 : script:ocaml(r.p1) { close(p1,p2) }; position r.p1;
expression e;
type T;
@@
- (T at p1 *@p2)
e
---
Basically, it assumes that if the type and the * are more than one space apart then there is something important there, and the cast is not removed.
julia