From: mstefani@redhat.com (Michael Stefaniuc)
To: cocci@systeme.lip6.fr
Subject: [Cocci] Prepending '*' to an expression (Was: [PATCH V2] scripts/coccinelle/misc/memcpy-assign.cocci: Replace memcpy with struct assignment)
Date: Thu, 24 Jan 2013 18:47:31 +0100 [thread overview]
Message-ID: <510173B3.9090002@redhat.com> (raw)
In-Reply-To: <1358978790-2990-1-git-send-email-peter.senna@gmail.com>
Hello,
On 01/23/2013 11:06 PM, Peter Senna Tschudin wrote:
> There are error-prone memcpy() that can be replaced by struct
> assignment that are type-safe and much easier to read. This semantic
> patch looks for memcpy() that can be replaced by struct assignment.
thanks for the script by Peter this script as it proved useful for Wine
too. Though in one case it generated the wrong patch.
@@
struct struct_name to;
struct struct_name from;
@@
'to' and 'from' above are expressions and not identifiers; that's a
feature. The bug happened in the replacement
- memcpy(foos + count, &foo, sizeof(struct foo_t));
+ *foos + count = foo;
Shouldn't cocinelle automatically add the parenthesis when prepending a
'*' or '&' to an expression which isn't an identifier?
The script itself is "safe" as the compiler will error out on that
patch. And the people that just take generated patches and submit them
without even compiling them deserve the public tar and feathering ;)
bye
michael
>
> Inspired by patches sent by Ezequiel Garcia <elezegarcia@gmail.com>
>
> Signed-off-by: Peter Senna Tschudin <peter.senna@gmail.com>
> ---
> Changes from V1:
> Updated commit message
> Changed Confidence comment to High on the semantic patch
>
> scripts/coccinelle/misc/memcpy-assign.cocci | 103 ++++++++++++++++++++++++++++
> 1 file changed, 103 insertions(+)
> create mode 100644 scripts/coccinelle/misc/memcpy-assign.cocci
>
> diff --git a/scripts/coccinelle/misc/memcpy-assign.cocci b/scripts/coccinelle/misc/memcpy-assign.cocci
> new file mode 100644
> index 0000000..afd058b
> --- /dev/null
> +++ b/scripts/coccinelle/misc/memcpy-assign.cocci
> @@ -0,0 +1,103 @@
> +//
> +// Replace memcpy with struct assignment.
> +//
> +// Confidence: High
> +// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6. GPLv2.
> +// URL: http://coccinelle.lip6.fr/
> +// Comments:
> +// Options: --no-includes --include-headers
> +
> +virtual patch
> +virtual report
> +virtual context
> +virtual org
> +
> + at r1 depends on !patch@
> +identifier struct_name;
> +struct struct_name to;
> +struct struct_name from;
> +struct struct_name *top;
> +struct struct_name *fromp;
> +position p;
> +@@
> +memcpy at p(\(&(to)\|top\), \(&(from)\|fromp\), \(sizeof(to)\|sizeof(from)\|sizeof(struct struct_name)\|sizeof(*top)\|sizeof(*fromp)\))
> +
> + at script:python depends on report@
> +p << r1.p;
> +@@
> +coccilib.report.print_report(p[0],"Replace memcpy with struct assignment")
> +
> + at depends on context@
> +position r1.p;
> +@@
> +*memcpy at p(...);
> +
> + at script:python depends on org@
> +p << r1.p;
> +@@
> +cocci.print_main("Replace memcpy with struct assignment",p)
> +
> + at depends on patch@
> +identifier struct_name;
> +struct struct_name to;
> +struct struct_name from;
> +@@
> +(
> +-memcpy(&(to), &(from), sizeof(to));
> ++to = from;
> +|
> +-memcpy(&(to), &(from), sizeof(from));
> ++to = from;
> +|
> +-memcpy(&(to), &(from), sizeof(struct struct_name));
> ++to = from;
> +)
> +
> + at depends on patch@
> +identifier struct_name;
> +struct struct_name to;
> +struct struct_name *from;
> +@@
> +(
> +-memcpy(&(to), from, sizeof(to));
> ++to = *from;
> +|
> +-memcpy(&(to), from, sizeof(*from));
> ++to = *from;
> +|
> +-memcpy(&(to), from, sizeof(struct struct_name));
> ++to = *from;
> +)
> +
> + at depends on patch@
> +identifier struct_name;
> +struct struct_name *to;
> +struct struct_name from;
> +@@
> +(
> +-memcpy(to, &(from), sizeof(*to));
> ++ *to = from;
> +|
> +-memcpy(to, &(from), sizeof(from));
> ++ *to = from;
> +|
> +-memcpy(to, &(from), sizeof(struct struct_name));
> ++ *to = from;
> +)
> +
> + at depends on patch@
> +identifier struct_name;
> +struct struct_name *to;
> +struct struct_name *from;
> +@@
> +(
> +-memcpy(to, from, sizeof(*to));
> ++ *to = *from;
> +|
> +-memcpy(to, from, sizeof(*from));
> ++ *to = *from;
> +|
> +-memcpy(to, from, sizeof(struct struct_name));
> ++ *to = *from;
> +)
> +
next prev parent reply other threads:[~2013-01-24 17:47 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-23 22:06 [Cocci] [PATCH V2] scripts/coccinelle/misc/memcpy-assign.cocci: Replace memcpy with struct assignment Peter Senna Tschudin
2013-01-24 17:47 ` Michael Stefaniuc [this message]
2013-01-24 18:05 ` [Cocci] Prepending '*' to an expression (Was: [PATCH V2] scripts/coccinelle/misc/memcpy-assign.cocci: Replace memcpy with struct assignment) Julia Lawall
2013-01-26 1:28 ` Peter Senna Tschudin
2013-01-27 20:46 ` Michael Stefaniuc
2013-01-28 22:04 ` Julia Lawall
2013-01-29 21:38 ` Michael Stefaniuc
2013-01-29 21:42 ` Julia Lawall
2013-02-06 14:37 ` Michael Stefaniuc
2013-02-22 10:25 ` [Cocci] [PATCH V2] scripts/coccinelle/misc/memcpy-assign.cocci: Replace memcpy with struct assignment Michal Marek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=510173B3.9090002@redhat.com \
--to=mstefani@redhat.com \
--cc=cocci@systeme.lip6.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox