1 // SPDX-License-Identifier: GPL-2.0-only 1 // SPDX-License-Identifier: GPL-2.0-only 2 /// Compare pointer-typed values to NULL rathe 2 /// Compare pointer-typed values to NULL rather than 0 3 /// 3 /// 4 //# This makes an effort to choose between !x 4 //# This makes an effort to choose between !x and x == NULL. !x is used 5 //# if it has previously been used with the fu 5 //# if it has previously been used with the function used to initialize x. 6 //# This relies on type information. More typ 6 //# This relies on type information. More type information can be obtained 7 //# using the option -all_includes and the opt 7 //# using the option -all_includes and the option -I to specify an 8 //# include path. 8 //# include path. 9 // 9 // 10 // Confidence: High 10 // Confidence: High 11 // Copyright: (C) 2012 Julia Lawall, INRIA/LIP 11 // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. 12 // Copyright: (C) 2012 Gilles Muller, INRIA/Li 12 // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. 13 // URL: https://coccinelle.gitlabpages.inria.f 13 // URL: https://coccinelle.gitlabpages.inria.fr/website 14 // Requires: 1.0.0 14 // Requires: 1.0.0 15 // Options: 15 // Options: 16 16 17 virtual patch 17 virtual patch 18 virtual context 18 virtual context 19 virtual org 19 virtual org 20 virtual report 20 virtual report 21 21 22 @initialize:ocaml@ 22 @initialize:ocaml@ 23 @@ 23 @@ 24 let negtable = Hashtbl.create 101 24 let negtable = Hashtbl.create 101 25 25 26 @depends on patch@ 26 @depends on patch@ 27 expression *E; 27 expression *E; 28 identifier f; 28 identifier f; 29 @@ 29 @@ 30 30 31 ( 31 ( 32 (E = f(...)) == 32 (E = f(...)) == 33 - 0 33 - 0 34 + NULL 34 + NULL 35 | 35 | 36 (E = f(...)) != 36 (E = f(...)) != 37 - 0 37 - 0 38 + NULL 38 + NULL 39 | 39 | 40 - 0 40 - 0 41 + NULL 41 + NULL 42 == (E = f(...)) 42 == (E = f(...)) 43 | 43 | 44 - 0 44 - 0 45 + NULL 45 + NULL 46 != (E = f(...)) 46 != (E = f(...)) 47 ) 47 ) 48 48 49 49 50 @t1 depends on !patch@ 50 @t1 depends on !patch@ 51 expression *E; 51 expression *E; 52 identifier f; 52 identifier f; 53 position p; 53 position p; 54 @@ 54 @@ 55 55 56 ( 56 ( 57 (E = f(...)) == 57 (E = f(...)) == 58 * 0@p 58 * 0@p 59 | 59 | 60 (E = f(...)) != 60 (E = f(...)) != 61 * 0@p 61 * 0@p 62 | 62 | 63 * 0@p 63 * 0@p 64 == (E = f(...)) 64 == (E = f(...)) 65 | 65 | 66 * 0@p 66 * 0@p 67 != (E = f(...)) 67 != (E = f(...)) 68 ) 68 ) 69 69 70 @script:python depends on org@ 70 @script:python depends on org@ 71 p << t1.p; 71 p << t1.p; 72 @@ 72 @@ 73 73 74 coccilib.org.print_todo(p[0], "WARNING compari 74 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0") 75 75 76 @script:python depends on report@ 76 @script:python depends on report@ 77 p << t1.p; 77 p << t1.p; 78 @@ 78 @@ 79 79 80 coccilib.report.print_report(p[0], "WARNING co 80 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0") 81 81 82 // Tests of returned values 82 // Tests of returned values 83 83 84 @s@ 84 @s@ 85 identifier f; 85 identifier f; 86 expression E,E1; 86 expression E,E1; 87 @@ 87 @@ 88 88 89 E = f(...) 89 E = f(...) 90 ... when != E = E1 90 ... when != E = E1 91 !E 91 !E 92 92 93 @script:ocaml depends on s@ 93 @script:ocaml depends on s@ 94 f << s.f; 94 f << s.f; 95 @@ 95 @@ 96 96 97 try let _ = Hashtbl.find negtable f in () 97 try let _ = Hashtbl.find negtable f in () 98 with Not_found -> Hashtbl.add negtable f () 98 with Not_found -> Hashtbl.add negtable f () 99 99 100 @ r disable is_zero,isnt_zero exists @ 100 @ r disable is_zero,isnt_zero exists @ 101 expression *E; 101 expression *E; 102 identifier f; 102 identifier f; 103 @@ 103 @@ 104 104 105 E = f(...) 105 E = f(...) 106 ... 106 ... 107 (E == 0 107 (E == 0 108 |E != 0 108 |E != 0 109 |0 == E 109 |0 == E 110 |0 != E 110 |0 != E 111 ) 111 ) 112 112 113 @script:ocaml@ 113 @script:ocaml@ 114 f << r.f; 114 f << r.f; 115 @@ 115 @@ 116 116 117 try let _ = Hashtbl.find negtable f in () 117 try let _ = Hashtbl.find negtable f in () 118 with Not_found -> include_match false 118 with Not_found -> include_match false 119 119 120 // This rule may lead to inconsistent path pro 120 // This rule may lead to inconsistent path problems, if E is defined in two 121 // places 121 // places 122 @ depends on patch disable is_zero,isnt_zero @ 122 @ depends on patch disable is_zero,isnt_zero @ 123 expression *E; 123 expression *E; 124 expression E1; 124 expression E1; 125 identifier r.f; 125 identifier r.f; 126 @@ 126 @@ 127 127 128 E = f(...) 128 E = f(...) 129 <... 129 <... 130 ( 130 ( 131 - E == 0 131 - E == 0 132 + !E 132 + !E 133 | 133 | 134 - E != 0 134 - E != 0 135 + E 135 + E 136 | 136 | 137 - 0 == E 137 - 0 == E 138 + !E 138 + !E 139 | 139 | 140 - 0 != E 140 - 0 != E 141 + E 141 + E 142 ) 142 ) 143 ...> 143 ...> 144 ?E = E1 144 ?E = E1 145 145 146 @t2 depends on !patch disable is_zero,isnt_zer 146 @t2 depends on !patch disable is_zero,isnt_zero @ 147 expression *E; 147 expression *E; 148 expression E1; 148 expression E1; 149 identifier r.f; 149 identifier r.f; 150 position p1; 150 position p1; 151 position p2; 151 position p2; 152 @@ 152 @@ 153 153 154 E = f(...) 154 E = f(...) 155 <... 155 <... 156 ( 156 ( 157 * E == 0@p1 157 * E == 0@p1 158 | 158 | 159 * E != 0@p2 159 * E != 0@p2 160 | 160 | 161 * 0@p1 == E 161 * 0@p1 == E 162 | 162 | 163 * 0@p1 != E 163 * 0@p1 != E 164 ) 164 ) 165 ...> 165 ...> 166 ?E = E1 166 ?E = E1 167 167 168 @script:python depends on org@ 168 @script:python depends on org@ 169 p << t2.p1; 169 p << t2.p1; 170 @@ 170 @@ 171 171 172 coccilib.org.print_todo(p[0], "WARNING compari 172 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0, suggest !E") 173 173 174 @script:python depends on org@ 174 @script:python depends on org@ 175 p << t2.p2; 175 p << t2.p2; 176 @@ 176 @@ 177 177 178 coccilib.org.print_todo(p[0], "WARNING compari 178 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0") 179 179 180 @script:python depends on report@ 180 @script:python depends on report@ 181 p << t2.p1; 181 p << t2.p1; 182 @@ 182 @@ 183 183 184 coccilib.report.print_report(p[0], "WARNING co 184 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0, suggest !E") 185 185 186 @script:python depends on report@ 186 @script:python depends on report@ 187 p << t2.p2; 187 p << t2.p2; 188 @@ 188 @@ 189 189 190 coccilib.report.print_report(p[0], "WARNING co 190 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0") 191 191 192 @ depends on patch disable is_zero,isnt_zero @ 192 @ depends on patch disable is_zero,isnt_zero @ 193 expression *E; 193 expression *E; 194 @@ 194 @@ 195 195 196 ( 196 ( 197 E == 197 E == 198 - 0 198 - 0 199 + NULL 199 + NULL 200 | 200 | 201 E != 201 E != 202 - 0 202 - 0 203 + NULL 203 + NULL 204 | 204 | 205 - 0 205 - 0 206 + NULL 206 + NULL 207 == E 207 == E 208 | 208 | 209 - 0 209 - 0 210 + NULL 210 + NULL 211 != E 211 != E 212 ) 212 ) 213 213 214 @ t3 depends on !patch disable is_zero,isnt_ze 214 @ t3 depends on !patch disable is_zero,isnt_zero @ 215 expression *E; 215 expression *E; 216 position p; 216 position p; 217 @@ 217 @@ 218 218 219 ( 219 ( 220 * E == 0@p 220 * E == 0@p 221 | 221 | 222 * E != 0@p 222 * E != 0@p 223 | 223 | 224 * 0@p == E 224 * 0@p == E 225 | 225 | 226 * 0@p != E 226 * 0@p != E 227 ) 227 ) 228 228 229 @script:python depends on org@ 229 @script:python depends on org@ 230 p << t3.p; 230 p << t3.p; 231 @@ 231 @@ 232 232 233 coccilib.org.print_todo(p[0], "WARNING compari 233 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0") 234 234 235 @script:python depends on report@ 235 @script:python depends on report@ 236 p << t3.p; 236 p << t3.p; 237 @@ 237 @@ 238 238 239 coccilib.report.print_report(p[0], "WARNING co 239 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.