1/// Use kstrdup rather than duplicating its implementation 2/// 3// Confidence: High 4// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. 5// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. 6// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. 7// URL: http://coccinelle.lip6.fr/ 8// Comments: 9// Options: --no-includes --include-headers 10 11virtual patch 12virtual context 13virtual org 14virtual report 15 16@depends on patch@ 17expression from,to; 18expression flag,E1,E2; 19statement S; 20@@ 21 22- to = kmalloc(strlen(from) + 1,flag); 23+ to = kstrdup(from, flag); 24 ... when != \(from = E1 \| to = E1 \) 25 if (to==NULL || ...) S 26 ... when != \(from = E2 \| to = E2 \) 27- strcpy(to, from); 28 29@depends on patch@ 30expression x,from,to; 31expression flag,E1,E2,E3; 32statement S; 33@@ 34 35- x = strlen(from) + 1; 36 ... when != \( x = E1 \| from = E1 \) 37- to = \(kmalloc\|kzalloc\)(x,flag); 38+ to = kstrdup(from, flag); 39 ... when != \(x = E2 \| from = E2 \| to = E2 \) 40 if (to==NULL || ...) S 41 ... when != \(x = E3 \| from = E3 \| to = E3 \) 42- memcpy(to, from, x); 43 44// --------------------------------------------------------------------- 45 46@r1 depends on !patch exists@ 47expression from,to; 48expression flag,E1,E2; 49statement S; 50position p1,p2; 51@@ 52 53* to = kmalloc@p1(strlen(from) + 1,flag); 54 ... when != \(from = E1 \| to = E1 \) 55 if (to==NULL || ...) S 56 ... when != \(from = E2 \| to = E2 \) 57* strcpy@p2(to, from); 58 59@r2 depends on !patch exists@ 60expression x,from,to; 61expression flag,E1,E2,E3; 62statement S; 63position p1,p2; 64@@ 65 66* x = strlen(from) + 1; 67 ... when != \( x = E1 \| from = E1 \) 68* to = \(kmalloc@p1\|kzalloc@p2\)(x,flag); 69 ... when != \(x = E2 \| from = E2 \| to = E2 \) 70 if (to==NULL || ...) S 71 ... when != \(x = E3 \| from = E3 \| to = E3 \) 72* memcpy@p2(to, from, x); 73 74@script:python depends on org@ 75p1 << r1.p1; 76p2 << r1.p2; 77@@ 78 79cocci.print_main("WARNING opportunity for kstrdep",p1) 80cocci.print_secs("strcpy",p2) 81 82@script:python depends on org@ 83p1 << r2.p1; 84p2 << r2.p2; 85@@ 86 87cocci.print_main("WARNING opportunity for kstrdep",p1) 88cocci.print_secs("memcpy",p2) 89 90@script:python depends on report@ 91p1 << r1.p1; 92p2 << r1.p2; 93@@ 94 95msg = "WARNING opportunity for kstrdep (strcpy on line %s)" % (p2[0].line) 96coccilib.report.print_report(p1[0], msg) 97 98@script:python depends on report@ 99p1 << r2.p1; 100p2 << r2.p2; 101@@ 102 103msg = "WARNING opportunity for kstrdep (memcpy on line %s)" % (p2[0].line) 104coccilib.report.print_report(p1[0], msg) 105