Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1357553 > unrolled thread

coccinelle: generalized removal of unnecessary pointer casts?

Started byJoe Perches <joe@perches.com>
First post2016-03-14 20:00 +0100
Last post2016-03-15 07:00 +0100
Articles 4 — 2 participants

Back to article view | Back to linux.kernel


Contents

  coccinelle: generalized removal of unnecessary pointer casts? Joe Perches <joe@perches.com> - 2016-03-14 20:00 +0100
    Re: coccinelle: generalized removal of unnecessary pointer casts? Julia Lawall <julia.lawall@lip6.fr> - 2016-03-14 21:50 +0100
      Re: coccinelle: generalized removal of unnecessary pointer casts? Joe Perches <joe@perches.com> - 2016-03-14 23:30 +0100
        Re: coccinelle: generalized removal of unnecessary pointer casts? Julia Lawall <julia.lawall@lip6.fr> - 2016-03-15 07:00 +0100

#1357553 — coccinelle: generalized removal of unnecessary pointer casts?

FromJoe Perches <joe@perches.com>
Date2016-03-14 20:00 +0100
Subjectcoccinelle: generalized removal of unnecessary pointer casts?
Message-ID<rcFSG-7FX-15@gated-at.bofh.it>
I wrote a little cocci script to remove unnecessary
casts for memset and memcpy (below) and tested it on
linux kernel's drivers/staging/ directory.

For instance, when dst and src are already pointers:

-	memcpy((u8 *)dst, (u8 *)src, r8712_get_wlan_bssid_ex_sz(src));
+	memcpy(dst, src, r8712_get_wlan_bssid_ex_sz(src));

It works ok, (it doesn't remove unnecessary parentheses
around the pointers) but it makes me wonder if there's a
generalized spatch mechanism to remove casts when an
arbitrary function takes a void * in any argument
position and a call to that function uses a cast of a
pointer to any pointer type for that argument.

$ cat remove_mem_casts.cocci 
@@
type t;
t *p;
type v;
expression e1;
expression e2;
@@

-	memset((v*)p, e1, e2)
+	memset(p, e1, e2)

@@
type t;
t *p;
type v;
expression e1;
expression e2;
@@

-	memcpy((v*)p, e1, e2)
+	memcpy(p, e1, e2)

@@
type t;
t *p;
type v;
expression e1;
expression e2;
@@

-	memcpy(e1, (v*)p, e2)
+	memcpy(e1, p, e2)

@@
type t1;
type t2;
t1 *p1;
t2 *p2;
type v1;
type v2;
expression e1;
@@

-	memcpy((v1*)p1, (v2*)p2, e1)
+	memcpy(p1, p2, e1)

[toc] | [next] | [standalone]


#1357619

FromJulia Lawall <julia.lawall@lip6.fr>
Date2016-03-14 21:50 +0100
Message-ID<rcHB8-pu-25@gated-at.bofh.it>
In reply to#1357553

[Multipart message — attachments visible in raw view] — view raw

On Mon, 14 Mar 2016, Joe Perches wrote:

> I wrote a little cocci script to remove unnecessary
> casts for memset and memcpy (below) and tested it on
> linux kernel's drivers/staging/ directory.
> 
> For instance, when dst and src are already pointers:
> 
> -	memcpy((u8 *)dst, (u8 *)src, r8712_get_wlan_bssid_ex_sz(src));
> +	memcpy(dst, src, r8712_get_wlan_bssid_ex_sz(src));
> 
> It works ok, (it doesn't remove unnecessary parentheses
> around the pointers) but it makes me wonder if there's a
> generalized spatch mechanism to remove casts when an
> arbitrary function takes a void * in any argument
> position and a call to that function uses a cast of a
> pointer to any pointer type for that argument.
> 
> $ cat remove_mem_casts.cocci 
> @@
> type t;
> t *p;
> type v;
> expression e1;
> expression e2;
> @@
> 
> -	memset((v*)p, e1, e2)
> +	memset(p, e1, e2)
> 
> @@
> type t;
> t *p;
> type v;
> expression e1;
> expression e2;
> @@
> 
> -	memcpy((v*)p, e1, e2)
> +	memcpy(p, e1, e2)
> 
> @@
> type t;
> t *p;
> type v;
> expression e1;
> expression e2;
> @@
> 
> -	memcpy(e1, (v*)p, e2)
> +	memcpy(e1, p, e2)
> 
> @@
> type t1;
> type t2;
> t1 *p1;
> t2 *p2;
> type v1;
> type v2;
> expression e1;
> @@
> 
> -	memcpy((v1*)p1, (v2*)p2, e1)
> +	memcpy(p1, p2, e1)

This should do everything:

@@
identifier f;
expression *e;
type T;
@@

f(...,
- (T *)(
  e
- )
  ,...)

@@
identifier f;
expression *e;
type T;
@@

f(...,
- (T *)
  e
  ,...)

julia

[toc] | [prev] | [next] | [standalone]


#1357648

FromJoe Perches <joe@perches.com>
Date2016-03-14 23:30 +0100
Message-ID<rcJ9T-1vi-1@gated-at.bofh.it>
In reply to#1357619
On Mon, 2016-03-14 at 21:43 +0100, Julia Lawall wrote:
> On Mon, 14 Mar 2016, Joe Perches wrote:
> > I wrote a little cocci script to remove unnecessary
> > casts for memset and memcpy (below) and tested it on
> > linux kernel's drivers/staging/ directory.
> > 
> > For instance, when dst and src are already pointers:
> > 
> > -     memcpy((u8 *)dst, (u8 *)src, r8712_get_wlan_bssid_ex_sz(src));
> > +     memcpy(dst, src, r8712_get_wlan_bssid_ex_sz(src));
> > 
> > It works ok, (it doesn't remove unnecessary parentheses
> > around the pointers) but it makes me wonder if there's a
> > generalized spatch mechanism to remove casts when an
> > arbitrary function takes a void * in any argument
> > position and a call to that function uses a cast of a
> > pointer to any pointer type for that argument.
> > 
> > $ cat remove_mem_casts.cocci 
> > @@
> > type t;
> > t *p;
> > type v;
> > expression e1;
> > expression e2;
> > @@
> > 
> > -     memset((v*)p, e1, e2)
> > +     memset(p, e1, e2)
> > 
> > @@
> > type t;
> > t *p;
> > type v;
> > expression e1;
> > expression e2;
> > @@
> > 
> > -     memcpy((v*)p, e1, e2)
> > +     memcpy(p, e1, e2)
> > 
> > @@
> > type t;
> > t *p;
> > type v;
> > expression e1;
> > expression e2;
> > @@
> > 
> > -     memcpy(e1, (v*)p, e2)
> > +     memcpy(e1, p, e2)
> > 
> > @@
> > type t1;
> > type t2;
> > t1 *p1;
> > t2 *p2;
> > type v1;
> > type v2;
> > expression e1;
> > @@
> > 
> > -     memcpy((v1*)p1, (v2*)p2, e1)
> > +     memcpy(p1, p2, e1)
> 
> This should do everything:
> 
> @@
> identifier f;
> expression *e;
> type T;
> @@
> 
> f(...,
> - (T *)(
>   e
> - )
>   ,...)
> 
> @@
> identifier f;
> expression *e;
> type T;
> @@
> 
> f(...,
> - (T *)
>   e
>   ,...)
> 
> julia

Hi Julia,

I think your proposed script is not correct.
The function must take a void * argument.
There's no validation of that here.

cheers, Joe

[toc] | [prev] | [next] | [standalone]


#1357814

FromJulia Lawall <julia.lawall@lip6.fr>
Date2016-03-15 07:00 +0100
Message-ID<rcQbn-6hv-1@gated-at.bofh.it>
In reply to#1357648

[Multipart message — attachments visible in raw view] — view raw

On Mon, 14 Mar 2016, Joe Perches wrote:

> On Mon, 2016-03-14 at 21:43 +0100, Julia Lawall wrote:
> > On Mon, 14 Mar 2016, Joe Perches wrote:
> > > I wrote a little cocci script to remove unnecessary
> > > casts for memset and memcpy (below) and tested it on
> > > linux kernel's drivers/staging/ directory.
> > > 
> > > For instance, when dst and src are already pointers:
> > > 
> > > -     memcpy((u8 *)dst, (u8 *)src, r8712_get_wlan_bssid_ex_sz(src));
> > > +     memcpy(dst, src, r8712_get_wlan_bssid_ex_sz(src));
> > > 
> > > It works ok, (it doesn't remove unnecessary parentheses
> > > around the pointers) but it makes me wonder if there's a
> > > generalized spatch mechanism to remove casts when an
> > > arbitrary function takes a void * in any argument
> > > position and a call to that function uses a cast of a
> > > pointer to any pointer type for that argument.
> > > 
> > > $ cat remove_mem_casts.cocci 
> > > @@
> > > type t;
> > > t *p;
> > > type v;
> > > expression e1;
> > > expression e2;
> > > @@
> > > 
> > > -     memset((v*)p, e1, e2)
> > > +     memset(p, e1, e2)
> > > 
> > > @@
> > > type t;
> > > t *p;
> > > type v;
> > > expression e1;
> > > expression e2;
> > > @@
> > > 
> > > -     memcpy((v*)p, e1, e2)
> > > +     memcpy(p, e1, e2)
> > > 
> > > @@
> > > type t;
> > > t *p;
> > > type v;
> > > expression e1;
> > > expression e2;
> > > @@
> > > 
> > > -     memcpy(e1, (v*)p, e2)
> > > +     memcpy(e1, p, e2)
> > > 
> > > @@
> > > type t1;
> > > type t2;
> > > t1 *p1;
> > > t2 *p2;
> > > type v1;
> > > type v2;
> > > expression e1;
> > > @@
> > > 
> > > -     memcpy((v1*)p1, (v2*)p2, e1)
> > > +     memcpy(p1, p2, e1)
> > 
> > This should do everything:
> > 
> > @@
> > identifier f;
> > expression *e;
> > type T;
> > @@
> > 
> > f(...,
> > - (T *)(
> >   e
> > - )
> >   ,...)
> > 
> > @@
> > identifier f;
> > expression *e;
> > type T;
> > @@
> > 
> > f(...,
> > - (T *)
> >   e
> >   ,...)
> > 
> > julia
> 
> Hi Julia,
> 
> I think your proposed script is not correct.
> The function must take a void * argument.
> There's no validation of that here.

OK, that could be added, but I wonder why it is necessary?  Isn't one 
pointer type just as good as any other, since the value will just get 
casted to the pointer type of the parameter in the end anyway?

julia

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web