Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / scripts / coccinelle / misc / doubleinit.cocci
1 // SPDX-License-Identifier: GPL-2.0-only
2 /// Find duplicate field initializations.  This has a high rate of false
3 /// positives due to #ifdefs, which Coccinelle is not aware of in a structure
4 /// initialization.
5 ///
6 // Confidence: Low
7 // Copyright: (C) 2010-2012 Nicolas Palix.
8 // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
9 // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
10 // URL: http://coccinelle.lip6.fr/
11 // Comments: requires at least Coccinelle 0.2.4, lex or parse error otherwise
12 // Options: --no-includes --include-headers
13
14 virtual org
15 virtual report
16
17 @r@
18 identifier I, s, fld;
19 position p0,p;
20 expression E;
21 @@
22
23 struct I s =@p0 { ..., .fld@p = E, ...};
24
25 @s@
26 identifier I, s, r.fld;
27 position r.p0,p;
28 expression E;
29 @@
30
31 struct I s =@p0 { ..., .fld@p = E, ...};
32
33 @script:python depends on org@
34 p0 << r.p0;
35 fld << r.fld;
36 ps << s.p;
37 pr << r.p;
38 @@
39
40 if int(ps[0].line) < int(pr[0].line) or (int(ps[0].line) == int(pr[0].line) and int(ps[0].column) < int(pr[0].column)):
41   cocci.print_main(fld,p0)
42   cocci.print_secs("s",ps)
43   cocci.print_secs("r",pr)
44
45 @script:python depends on report@
46 p0 << r.p0;
47 fld << r.fld;
48 ps << s.p;
49 pr << r.p;
50 @@
51
52 if int(ps[0].line) < int(pr[0].line) or (int(ps[0].line) == int(pr[0].line) and int(ps[0].column) < int(pr[0].column)):
53   msg = "%s: first occurrence line %s, second occurrence line %s" % (fld,ps[0].line,pr[0].line)
54   coccilib.report.print_report(p0[0],msg)