 ff3771cb71
			
		
	
	
	ff3771cb71
	
	
	
		
			
			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 <elezegarcia@gmail.com> Signed-off-by: Peter Senna Tschudin <peter.senna@gmail.com> Signed-off-by: Michal Marek <mmarek@suse.cz>
		
			
				
	
	
		
			103 lines
		
	
	
	
		
			1.9 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
	
		
			1.9 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
| //
 | |
| // 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;
 | |
| )
 | |
| 
 |