forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
scripts/coccinelle/misc/memcpy-assign.cocci: Replace memcpy with stru…
…ct assignment 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. Inspired by patches sent by Ezequiel Garcia <[email protected]> Signed-off-by: Peter Senna Tschudin <[email protected]> Signed-off-by: Michal Marek <[email protected]>
- Loading branch information
1 parent
e0367a6
commit ff3771c
Showing
1 changed file
with
103 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
) | ||
|