Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /// Detect BQ27XXX_DATA structures with identical registers, dm registers or
0003 /// properties.
0004 //# Doesn't unfold macros used in register or property fields.
0005 //# Requires OCaml scripting
0006 ///
0007 // Confidence: High
0008 // Copyright: (C) 2017 Julia Lawall, Inria/LIP6,
0009 // URL: https://coccinelle.gitlabpages.inria.fr/website
0010 // Requires: 1.0.7
0011 // Keywords: BQ27XXX_DATA
0012 
0013 virtual report
0014 
0015 @initialize:ocaml@
0016 @@
0017 
0018 let print_report p msg =
0019   let p = List.hd p in
0020   Printf.printf "%s:%d:%d-%d: %s" p.file p.line p.col p.col_end msg
0021 
0022 @str depends on report@
0023 type t;
0024 identifier i,i1,i2;
0025 expression e1,e2;
0026 @@
0027 
0028 t i[] = {
0029   ...,
0030   [e1] = BQ27XXX_DATA(i1,...),
0031   ...,
0032   [e2] = BQ27XXX_DATA(i2,...),
0033   ...,
0034 };
0035 
0036 @script:ocaml tocheck@
0037 i1 << str.i1;
0038 i2 << str.i2;
0039 i1regs; i2regs;
0040 i1dmregs; i2dmregs;
0041 i1props; i2props;
0042 @@
0043 
0044 if not(i1 = i2)
0045 then
0046   begin
0047     i1regs := make_ident (i1 ^ "_regs");
0048     i2regs := make_ident (i2 ^ "_regs");
0049     i1dmregs := make_ident (i1 ^ "_dm_regs");
0050     i2dmregs := make_ident (i2 ^ "_dm_regs");
0051     i1props := make_ident (i1 ^ "_props");
0052     i2props := make_ident (i2 ^ "_props")
0053   end
0054 
0055 (* ---------------------------------------------------------------- *)
0056 
0057 @getregs1@
0058 typedef u8;
0059 identifier tocheck.i1regs;
0060 initializer list i1regs_vals;
0061 position p1;
0062 @@
0063 
0064 u8 i1regs@p1[...] = { i1regs_vals, };
0065 
0066 @getregs2@
0067 identifier tocheck.i2regs;
0068 initializer list i2regs_vals;
0069 position p2;
0070 @@
0071 
0072 u8 i2regs@p2[...] = { i2regs_vals, };
0073 
0074 @script:ocaml@
0075 (_,i1regs_vals) << getregs1.i1regs_vals;
0076 (_,i2regs_vals) << getregs2.i2regs_vals;
0077 i1regs << tocheck.i1regs;
0078 i2regs << tocheck.i2regs;
0079 p1 << getregs1.p1;
0080 p2 << getregs2.p2;
0081 @@
0082 
0083 if i1regs < i2regs &&
0084    List.sort compare i1regs_vals = List.sort compare i2regs_vals
0085 then
0086   let msg =
0087     Printf.sprintf
0088       "WARNING %s and %s (line %d) are identical\n"
0089       i1regs i2regs (List.hd p2).line in
0090   print_report p1 msg
0091 
0092 (* ---------------------------------------------------------------- *)
0093 
0094 @getdmregs1@
0095 identifier tocheck.i1dmregs;
0096 initializer list i1dmregs_vals;
0097 position p1;
0098 @@
0099 
0100 struct bq27xxx_dm_reg i1dmregs@p1[] = { i1dmregs_vals, };
0101 
0102 @getdmregs2@
0103 identifier tocheck.i2dmregs;
0104 initializer list i2dmregs_vals;
0105 position p2;
0106 @@
0107 
0108 struct bq27xxx_dm_reg i2dmregs@p2[] = { i2dmregs_vals, };
0109 
0110 @script:ocaml@
0111 (_,i1dmregs_vals) << getdmregs1.i1dmregs_vals;
0112 (_,i2dmregs_vals) << getdmregs2.i2dmregs_vals;
0113 i1dmregs << tocheck.i1dmregs;
0114 i2dmregs << tocheck.i2dmregs;
0115 p1 << getdmregs1.p1;
0116 p2 << getdmregs2.p2;
0117 @@
0118 
0119 if i1dmregs < i2dmregs &&
0120    List.sort compare i1dmregs_vals = List.sort compare i2dmregs_vals
0121 then
0122   let msg =
0123     Printf.sprintf
0124       "WARNING %s and %s (line %d) are identical\n"
0125       i1dmregs i2dmregs (List.hd p2).line in
0126   print_report p1 msg
0127 
0128 (* ---------------------------------------------------------------- *)
0129 
0130 @getprops1@
0131 identifier tocheck.i1props;
0132 initializer list[n1] i1props_vals;
0133 position p1;
0134 @@
0135 
0136 enum power_supply_property i1props@p1[] = { i1props_vals, };
0137 
0138 @getprops2@
0139 identifier tocheck.i2props;
0140 initializer list[n2] i2props_vals;
0141 position p2;
0142 @@
0143 
0144 enum power_supply_property i2props@p2[] = { i2props_vals, };
0145 
0146 @script:ocaml@
0147 (_,i1props_vals) << getprops1.i1props_vals;
0148 (_,i2props_vals) << getprops2.i2props_vals;
0149 i1props << tocheck.i1props;
0150 i2props << tocheck.i2props;
0151 p1 << getprops1.p1;
0152 p2 << getprops2.p2;
0153 @@
0154 
0155 if i1props < i2props &&
0156    List.sort compare i1props_vals = List.sort compare i2props_vals
0157 then
0158   let msg =
0159     Printf.sprintf
0160       "WARNING %s and %s (line %d) are identical\n"
0161       i1props i2props (List.hd p2).line in
0162   print_report p1 msg