xref: /openbmc/linux/scripts/coccinelle/api/kstrdup.cocci (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
17f904d7eSThomas Gleixner// SPDX-License-Identifier: GPL-2.0-only
2998f5523SNicolas Palix/// Use kstrdup rather than duplicating its implementation
3998f5523SNicolas Palix///
4998f5523SNicolas Palix// Confidence: High
57f904d7eSThomas Gleixner// Copyright: (C) 2010-2012 Nicolas Palix.
67f904d7eSThomas Gleixner// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
77f904d7eSThomas Gleixner// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
8*f01701ceSJulia Lawall// URL: https://coccinelle.gitlabpages.inria.fr/website
9998f5523SNicolas Palix// Comments:
1093f14468SNicolas Palix// Options: --no-includes --include-headers
11998f5523SNicolas Palix
12998f5523SNicolas Palixvirtual patch
1329a36d4dSJulia Lawallvirtual context
1429a36d4dSJulia Lawallvirtual org
1529a36d4dSJulia Lawallvirtual report
16998f5523SNicolas Palix
1729a36d4dSJulia Lawall@depends on patch@
18998f5523SNicolas Palixexpression from,to;
19998f5523SNicolas Palixexpression flag,E1,E2;
20998f5523SNicolas Palixstatement S;
21998f5523SNicolas Palix@@
22998f5523SNicolas Palix
23998f5523SNicolas Palix-  to = kmalloc(strlen(from) + 1,flag);
24998f5523SNicolas Palix+  to = kstrdup(from, flag);
25998f5523SNicolas Palix   ... when != \(from = E1 \| to = E1 \)
26998f5523SNicolas Palix   if (to==NULL || ...) S
27998f5523SNicolas Palix   ... when != \(from = E2 \| to = E2 \)
28998f5523SNicolas Palix-  strcpy(to, from);
29998f5523SNicolas Palix
3029a36d4dSJulia Lawall@depends on patch@
31998f5523SNicolas Palixexpression x,from,to;
32998f5523SNicolas Palixexpression flag,E1,E2,E3;
33998f5523SNicolas Palixstatement S;
34998f5523SNicolas Palix@@
35998f5523SNicolas Palix
36998f5523SNicolas Palix-   x = strlen(from) + 1;
37998f5523SNicolas Palix    ... when != \( x = E1 \| from = E1 \)
38998f5523SNicolas Palix-   to = \(kmalloc\|kzalloc\)(x,flag);
39998f5523SNicolas Palix+   to = kstrdup(from, flag);
40998f5523SNicolas Palix    ... when != \(x = E2 \| from = E2 \| to = E2 \)
41998f5523SNicolas Palix    if (to==NULL || ...) S
42998f5523SNicolas Palix    ... when != \(x = E3 \| from = E3 \| to = E3 \)
43998f5523SNicolas Palix-   memcpy(to, from, x);
4429a36d4dSJulia Lawall
4529a36d4dSJulia Lawall// ---------------------------------------------------------------------
4629a36d4dSJulia Lawall
4729a36d4dSJulia Lawall@r1 depends on !patch exists@
4829a36d4dSJulia Lawallexpression from,to;
4929a36d4dSJulia Lawallexpression flag,E1,E2;
5029a36d4dSJulia Lawallstatement S;
5129a36d4dSJulia Lawallposition p1,p2;
5229a36d4dSJulia Lawall@@
5329a36d4dSJulia Lawall
5429a36d4dSJulia Lawall*  to = kmalloc@p1(strlen(from) + 1,flag);
5529a36d4dSJulia Lawall   ... when != \(from = E1 \| to = E1 \)
5629a36d4dSJulia Lawall   if (to==NULL || ...) S
5729a36d4dSJulia Lawall   ... when != \(from = E2 \| to = E2 \)
5829a36d4dSJulia Lawall*  strcpy@p2(to, from);
5929a36d4dSJulia Lawall
6029a36d4dSJulia Lawall@r2 depends on !patch exists@
6129a36d4dSJulia Lawallexpression x,from,to;
6229a36d4dSJulia Lawallexpression flag,E1,E2,E3;
6329a36d4dSJulia Lawallstatement S;
6429a36d4dSJulia Lawallposition p1,p2;
6529a36d4dSJulia Lawall@@
6629a36d4dSJulia Lawall
6729a36d4dSJulia Lawall*   x = strlen(from) + 1;
6829a36d4dSJulia Lawall    ... when != \( x = E1 \| from = E1 \)
692fbecb7dSDenis Efremov*   to = \(kmalloc@p1\|kzalloc@p1\)(x,flag);
7029a36d4dSJulia Lawall    ... when != \(x = E2 \| from = E2 \| to = E2 \)
7129a36d4dSJulia Lawall    if (to==NULL || ...) S
7229a36d4dSJulia Lawall    ... when != \(x = E3 \| from = E3 \| to = E3 \)
7329a36d4dSJulia Lawall*   memcpy@p2(to, from, x);
7429a36d4dSJulia Lawall
7529a36d4dSJulia Lawall@script:python depends on org@
7629a36d4dSJulia Lawallp1 << r1.p1;
7729a36d4dSJulia Lawallp2 << r1.p2;
7829a36d4dSJulia Lawall@@
7929a36d4dSJulia Lawall
80a3b0b6f9SRikard Falkeborncocci.print_main("WARNING opportunity for kstrdup",p1)
8129a36d4dSJulia Lawallcocci.print_secs("strcpy",p2)
8229a36d4dSJulia Lawall
8329a36d4dSJulia Lawall@script:python depends on org@
8429a36d4dSJulia Lawallp1 << r2.p1;
8529a36d4dSJulia Lawallp2 << r2.p2;
8629a36d4dSJulia Lawall@@
8729a36d4dSJulia Lawall
88a3b0b6f9SRikard Falkeborncocci.print_main("WARNING opportunity for kstrdup",p1)
8929a36d4dSJulia Lawallcocci.print_secs("memcpy",p2)
9029a36d4dSJulia Lawall
9129a36d4dSJulia Lawall@script:python depends on report@
9229a36d4dSJulia Lawallp1 << r1.p1;
9329a36d4dSJulia Lawallp2 << r1.p2;
9429a36d4dSJulia Lawall@@
9529a36d4dSJulia Lawall
96a3b0b6f9SRikard Falkebornmsg = "WARNING opportunity for kstrdup (strcpy on line %s)" % (p2[0].line)
9729a36d4dSJulia Lawallcoccilib.report.print_report(p1[0], msg)
9829a36d4dSJulia Lawall
9929a36d4dSJulia Lawall@script:python depends on report@
10029a36d4dSJulia Lawallp1 << r2.p1;
10129a36d4dSJulia Lawallp2 << r2.p2;
10229a36d4dSJulia Lawall@@
10329a36d4dSJulia Lawall
104a3b0b6f9SRikard Falkebornmsg = "WARNING opportunity for kstrdup (memcpy on line %s)" % (p2[0].line)
10529a36d4dSJulia Lawallcoccilib.report.print_report(p1[0], msg)
106