Loading...
1/// Detect BQ27XXX_DATA structures with identical registers, dm registers or
2/// properties.
3//# Doesn't unfold macros used in register or property fields.
4//# Requires OCaml scripting
5///
6// Confidence: High
7// Copyright: (C) 2017 Julia Lawall, Inria/LIP6, GPLv2.
8// URL: http://coccinelle.lip6.fr/
9// Requires: 1.0.7
10// Keywords: BQ27XXX_DATA
11
12virtual report
13
14@initialize:ocaml@
15@@
16
17let print_report p msg =
18 let p = List.hd p in
19 Printf.printf "%s:%d:%d-%d: %s" p.file p.line p.col p.col_end msg
20
21@str depends on report@
22type t;
23identifier i,i1,i2;
24expression e1,e2;
25@@
26
27t i[] = {
28 ...,
29 [e1] = BQ27XXX_DATA(i1,...),
30 ...,
31 [e2] = BQ27XXX_DATA(i2,...),
32 ...,
33};
34
35@script:ocaml tocheck@
36i1 << str.i1;
37i2 << str.i2;
38i1regs; i2regs;
39i1dmregs; i2dmregs;
40i1props; i2props;
41@@
42
43if not(i1 = i2)
44then
45 begin
46 i1regs := make_ident (i1 ^ "_regs");
47 i2regs := make_ident (i2 ^ "_regs");
48 i1dmregs := make_ident (i1 ^ "_dm_regs");
49 i2dmregs := make_ident (i2 ^ "_dm_regs");
50 i1props := make_ident (i1 ^ "_props");
51 i2props := make_ident (i2 ^ "_props")
52 end
53
54(* ---------------------------------------------------------------- *)
55
56@getregs1@
57typedef u8;
58identifier tocheck.i1regs;
59initializer list i1regs_vals;
60position p1;
61@@
62
63u8 i1regs@p1[...] = { i1regs_vals, };
64
65@getregs2@
66identifier tocheck.i2regs;
67initializer list i2regs_vals;
68position p2;
69@@
70
71u8 i2regs@p2[...] = { i2regs_vals, };
72
73@script:ocaml@
74(_,i1regs_vals) << getregs1.i1regs_vals;
75(_,i2regs_vals) << getregs2.i2regs_vals;
76i1regs << tocheck.i1regs;
77i2regs << tocheck.i2regs;
78p1 << getregs1.p1;
79p2 << getregs2.p2;
80@@
81
82if i1regs < i2regs &&
83 List.sort compare i1regs_vals = List.sort compare i2regs_vals
84then
85 let msg =
86 Printf.sprintf
87 "WARNING %s and %s (line %d) are identical\n"
88 i1regs i2regs (List.hd p2).line in
89 print_report p1 msg
90
91(* ---------------------------------------------------------------- *)
92
93@getdmregs1@
94identifier tocheck.i1dmregs;
95initializer list i1dmregs_vals;
96position p1;
97@@
98
99struct bq27xxx_dm_reg i1dmregs@p1[] = { i1dmregs_vals, };
100
101@getdmregs2@
102identifier tocheck.i2dmregs;
103initializer list i2dmregs_vals;
104position p2;
105@@
106
107struct bq27xxx_dm_reg i2dmregs@p2[] = { i2dmregs_vals, };
108
109@script:ocaml@
110(_,i1dmregs_vals) << getdmregs1.i1dmregs_vals;
111(_,i2dmregs_vals) << getdmregs2.i2dmregs_vals;
112i1dmregs << tocheck.i1dmregs;
113i2dmregs << tocheck.i2dmregs;
114p1 << getdmregs1.p1;
115p2 << getdmregs2.p2;
116@@
117
118if i1dmregs < i2dmregs &&
119 List.sort compare i1dmregs_vals = List.sort compare i2dmregs_vals
120then
121 let msg =
122 Printf.sprintf
123 "WARNING %s and %s (line %d) are identical\n"
124 i1dmregs i2dmregs (List.hd p2).line in
125 print_report p1 msg
126
127(* ---------------------------------------------------------------- *)
128
129@getprops1@
130identifier tocheck.i1props;
131initializer list[n1] i1props_vals;
132position p1;
133@@
134
135enum power_supply_property i1props@p1[] = { i1props_vals, };
136
137@getprops2@
138identifier tocheck.i2props;
139initializer list[n2] i2props_vals;
140position p2;
141@@
142
143enum power_supply_property i2props@p2[] = { i2props_vals, };
144
145@script:ocaml@
146(_,i1props_vals) << getprops1.i1props_vals;
147(_,i2props_vals) << getprops2.i2props_vals;
148i1props << tocheck.i1props;
149i2props << tocheck.i2props;
150p1 << getprops1.p1;
151p2 << getprops2.p2;
152@@
153
154if i1props < i2props &&
155 List.sort compare i1props_vals = List.sort compare i2props_vals
156then
157 let msg =
158 Printf.sprintf
159 "WARNING %s and %s (line %d) are identical\n"
160 i1props i2props (List.hd p2).line in
161 print_report p1 msg
1// SPDX-License-Identifier: GPL-2.0-only
2/// Detect BQ27XXX_DATA structures with identical registers, dm registers or
3/// properties.
4//# Doesn't unfold macros used in register or property fields.
5//# Requires OCaml scripting
6///
7// Confidence: High
8// Copyright: (C) 2017 Julia Lawall, Inria/LIP6,
9// URL: http://coccinelle.lip6.fr/
10// Requires: 1.0.7
11// Keywords: BQ27XXX_DATA
12
13virtual report
14
15@initialize:ocaml@
16@@
17
18let print_report p msg =
19 let p = List.hd p in
20 Printf.printf "%s:%d:%d-%d: %s" p.file p.line p.col p.col_end msg
21
22@str depends on report@
23type t;
24identifier i,i1,i2;
25expression e1,e2;
26@@
27
28t i[] = {
29 ...,
30 [e1] = BQ27XXX_DATA(i1,...),
31 ...,
32 [e2] = BQ27XXX_DATA(i2,...),
33 ...,
34};
35
36@script:ocaml tocheck@
37i1 << str.i1;
38i2 << str.i2;
39i1regs; i2regs;
40i1dmregs; i2dmregs;
41i1props; i2props;
42@@
43
44if not(i1 = i2)
45then
46 begin
47 i1regs := make_ident (i1 ^ "_regs");
48 i2regs := make_ident (i2 ^ "_regs");
49 i1dmregs := make_ident (i1 ^ "_dm_regs");
50 i2dmregs := make_ident (i2 ^ "_dm_regs");
51 i1props := make_ident (i1 ^ "_props");
52 i2props := make_ident (i2 ^ "_props")
53 end
54
55(* ---------------------------------------------------------------- *)
56
57@getregs1@
58typedef u8;
59identifier tocheck.i1regs;
60initializer list i1regs_vals;
61position p1;
62@@
63
64u8 i1regs@p1[...] = { i1regs_vals, };
65
66@getregs2@
67identifier tocheck.i2regs;
68initializer list i2regs_vals;
69position p2;
70@@
71
72u8 i2regs@p2[...] = { i2regs_vals, };
73
74@script:ocaml@
75(_,i1regs_vals) << getregs1.i1regs_vals;
76(_,i2regs_vals) << getregs2.i2regs_vals;
77i1regs << tocheck.i1regs;
78i2regs << tocheck.i2regs;
79p1 << getregs1.p1;
80p2 << getregs2.p2;
81@@
82
83if i1regs < i2regs &&
84 List.sort compare i1regs_vals = List.sort compare i2regs_vals
85then
86 let msg =
87 Printf.sprintf
88 "WARNING %s and %s (line %d) are identical\n"
89 i1regs i2regs (List.hd p2).line in
90 print_report p1 msg
91
92(* ---------------------------------------------------------------- *)
93
94@getdmregs1@
95identifier tocheck.i1dmregs;
96initializer list i1dmregs_vals;
97position p1;
98@@
99
100struct bq27xxx_dm_reg i1dmregs@p1[] = { i1dmregs_vals, };
101
102@getdmregs2@
103identifier tocheck.i2dmregs;
104initializer list i2dmregs_vals;
105position p2;
106@@
107
108struct bq27xxx_dm_reg i2dmregs@p2[] = { i2dmregs_vals, };
109
110@script:ocaml@
111(_,i1dmregs_vals) << getdmregs1.i1dmregs_vals;
112(_,i2dmregs_vals) << getdmregs2.i2dmregs_vals;
113i1dmregs << tocheck.i1dmregs;
114i2dmregs << tocheck.i2dmregs;
115p1 << getdmregs1.p1;
116p2 << getdmregs2.p2;
117@@
118
119if i1dmregs < i2dmregs &&
120 List.sort compare i1dmregs_vals = List.sort compare i2dmregs_vals
121then
122 let msg =
123 Printf.sprintf
124 "WARNING %s and %s (line %d) are identical\n"
125 i1dmregs i2dmregs (List.hd p2).line in
126 print_report p1 msg
127
128(* ---------------------------------------------------------------- *)
129
130@getprops1@
131identifier tocheck.i1props;
132initializer list[n1] i1props_vals;
133position p1;
134@@
135
136enum power_supply_property i1props@p1[] = { i1props_vals, };
137
138@getprops2@
139identifier tocheck.i2props;
140initializer list[n2] i2props_vals;
141position p2;
142@@
143
144enum power_supply_property i2props@p2[] = { i2props_vals, };
145
146@script:ocaml@
147(_,i1props_vals) << getprops1.i1props_vals;
148(_,i2props_vals) << getprops2.i2props_vals;
149i1props << tocheck.i1props;
150i2props << tocheck.i2props;
151p1 << getprops1.p1;
152p2 << getprops2.p2;
153@@
154
155if i1props < i2props &&
156 List.sort compare i1props_vals = List.sort compare i2props_vals
157then
158 let msg =
159 Printf.sprintf
160 "WARNING %s and %s (line %d) are identical\n"
161 i1props i2props (List.hd p2).line in
162 print_report p1 msg