Hello Michael, Thank you for testing.
I made changes on the semantic patch. I believe it fixed the problem. Can you test it? []'s Peter On Thu, Jan 24, 2013 at 3:47 PM, Michael Stefaniuc <mstef...@redhat.com> wrote: > 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 <elezegar...@gmail.com> >> >> Signed-off-by: Peter Senna Tschudin <peter.se...@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 >> + >> +@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@p(\(&(to)\|top\), \(&(from)\|fromp\), >> \(sizeof(to)\|sizeof(from)\|sizeof(struct >> struct_name)\|sizeof(*top)\|sizeof(*fromp)\)) >> + >> +@script:python depends on report@ >> +p << r1.p; >> +@@ >> +coccilib.report.print_report(p[0],"Replace memcpy with struct assignment") >> + >> +@depends on context@ >> +position r1.p; >> +@@ >> +*memcpy@p(...); >> + >> +@script:python depends on org@ >> +p << r1.p; >> +@@ >> +cocci.print_main("Replace memcpy with struct assignment",p) >> + >> +@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; >> +) >> + >> +@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; >> +) >> + >> +@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; >> +) >> + >> +@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; >> +) >> + -- Peter
memcpy-assign.cocci
Description: Binary data
_______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci