1// SPDX-License-Identifier: GPL-2.0-only 2/// Use kstrdup rather than duplicating its implementation 3/// 4// Confidence: High 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. 8// URL: https://coccinelle.gitlabpages.inria.fr/website 9// Comments: 10// Options: --no-includes --include-headers 11 12virtual patch 13virtual context 14virtual org 15virtual report 16 17@depends on patch@ 18expression from,to; 19expression flag,E1,E2; 20statement 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 30@depends on patch@ 31expression x,from,to; 32expression flag,E1,E2,E3; 33statement 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); 44 45// --------------------------------------------------------------------- 46 47@r1 depends on !patch exists@ 48expression from,to; 49expression flag,E1,E2; 50statement S; 51position 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@ 61expression x,from,to; 62expression flag,E1,E2,E3; 63statement S; 64position p1,p2; 65@@ 66 67* x = strlen(from) + 1; 68 ... when != \( x = E1 \| from = E1 \) 69* to = \(kmalloc@p1\|kzalloc@p1\)(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@ 76p1 << r1.p1; 77p2 << r1.p2; 78@@ 79 80cocci.print_main("WARNING opportunity for kstrdup",p1) 81cocci.print_secs("strcpy",p2) 82 83@script:python depends on org@ 84p1 << r2.p1; 85p2 << r2.p2; 86@@ 87 88cocci.print_main("WARNING opportunity for kstrdup",p1) 89cocci.print_secs("memcpy",p2) 90 91@script:python depends on report@ 92p1 << r1.p1; 93p2 << r1.p2; 94@@ 95 96msg = "WARNING opportunity for kstrdup (strcpy on line %s)" % (p2[0].line) 97coccilib.report.print_report(p1[0], msg) 98 99@script:python depends on report@ 100p1 << r2.p1; 101p2 << r2.p2; 102@@ 103 104msg = "WARNING opportunity for kstrdup (memcpy on line %s)" % (p2[0].line) 105coccilib.report.print_report(p1[0], msg) 106