scripts/coccinelle: improve the coverage of some semantic patches
[~shefty/rdma-dev.git] / scripts / coccinelle / api / kstrdup.cocci
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
11 virtual patch
12 virtual context
13 virtual org
14 virtual report
15
16 @depends on patch@
17 expression from,to;
18 expression flag,E1,E2;
19 statement 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@
30 expression x,from,to;
31 expression flag,E1,E2,E3;
32 statement 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@
47 expression from,to;
48 expression flag,E1,E2;
49 statement S;
50 position 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@
60 expression x,from,to;
61 expression flag,E1,E2,E3;
62 statement S;
63 position 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@
75 p1 << r1.p1;
76 p2 << r1.p2;
77 @@
78
79 cocci.print_main("WARNING opportunity for kstrdep",p1)
80 cocci.print_secs("strcpy",p2)
81
82 @script:python depends on org@
83 p1 << r2.p1;
84 p2 << r2.p2;
85 @@
86
87 cocci.print_main("WARNING opportunity for kstrdep",p1)
88 cocci.print_secs("memcpy",p2)
89
90 @script:python depends on report@
91 p1 << r1.p1;
92 p2 << r1.p2;
93 @@
94
95 msg = "WARNING opportunity for kstrdep (strcpy on line %s)" % (p2[0].line)
96 coccilib.report.print_report(p1[0], msg)
97
98 @script:python depends on report@
99 p1 << r2.p1;
100 p2 << r2.p2;
101 @@
102
103 msg = "WARNING opportunity for kstrdep (memcpy on line %s)" % (p2[0].line)
104 coccilib.report.print_report(p1[0], msg)