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