1 // SPDX-License-Identifier: GPL-2.0-only 1 // SPDX-License-Identifier: GPL-2.0-only 2 /// 2 /// 3 /// Check for opencoded min(), max() implement 3 /// Check for opencoded min(), max() implementations. 4 /// Generated patches sometimes require adding 4 /// Generated patches sometimes require adding a cast to fix compile warning. 5 /// Warnings/patches scope intentionally limit 5 /// Warnings/patches scope intentionally limited to a function body. 6 /// 6 /// 7 // Confidence: Medium 7 // Confidence: Medium 8 // Copyright: (C) 2021 Denis Efremov ISPRAS 8 // Copyright: (C) 2021 Denis Efremov ISPRAS 9 // Options: --no-includes --include-headers 9 // Options: --no-includes --include-headers 10 // 10 // 11 // Keywords: min, max 11 // Keywords: min, max 12 // 12 // 13 13 14 14 15 virtual report 15 virtual report 16 virtual org 16 virtual org 17 virtual context 17 virtual context 18 virtual patch 18 virtual patch 19 19 20 @rmax depends on !patch@ 20 @rmax depends on !patch@ 21 identifier func; 21 identifier func; 22 expression x, y; 22 expression x, y; 23 binary operator cmp = {>, >=}; 23 binary operator cmp = {>, >=}; 24 position p; 24 position p; 25 @@ 25 @@ 26 26 27 func(...) 27 func(...) 28 { 28 { 29 <... 29 <... 30 * ((x) cmp@p (y) ? (x) : (y)) 30 * ((x) cmp@p (y) ? (x) : (y)) 31 ...> 31 ...> 32 } 32 } 33 33 34 @rmaxif depends on !patch@ 34 @rmaxif depends on !patch@ 35 identifier func; 35 identifier func; 36 expression x, y; 36 expression x, y; 37 expression max_val; 37 expression max_val; 38 binary operator cmp = {>, >=}; 38 binary operator cmp = {>, >=}; 39 position p; 39 position p; 40 @@ 40 @@ 41 41 42 func(...) 42 func(...) 43 { 43 { 44 <... 44 <... 45 * if ((x) cmp@p (y)) { 45 * if ((x) cmp@p (y)) { 46 * max_val = (x); 46 * max_val = (x); 47 * } else { 47 * } else { 48 * max_val = (y); 48 * max_val = (y); 49 * } 49 * } 50 ...> 50 ...> 51 } 51 } 52 52 53 // Ignore errcode returns. 53 // Ignore errcode returns. 54 @errcode@ 54 @errcode@ 55 position p; 55 position p; 56 identifier func; 56 identifier func; 57 expression x; 57 expression x; 58 binary operator cmp = {<, <=}; 58 binary operator cmp = {<, <=}; 59 @@ 59 @@ 60 60 61 func(...) 61 func(...) 62 { 62 { 63 <... 63 <... 64 return ((x) cmp@p 0 ? (x) : 0); 64 return ((x) cmp@p 0 ? (x) : 0); 65 ...> 65 ...> 66 } 66 } 67 67 68 @rmin depends on !patch@ 68 @rmin depends on !patch@ 69 identifier func; 69 identifier func; 70 expression x, y; 70 expression x, y; 71 binary operator cmp = {<, <=}; 71 binary operator cmp = {<, <=}; 72 position p != errcode.p; 72 position p != errcode.p; 73 @@ 73 @@ 74 74 75 func(...) 75 func(...) 76 { 76 { 77 <... 77 <... 78 * ((x) cmp@p (y) ? (x) : (y)) 78 * ((x) cmp@p (y) ? (x) : (y)) 79 ...> 79 ...> 80 } 80 } 81 81 82 @rminif depends on !patch@ 82 @rminif depends on !patch@ 83 identifier func; 83 identifier func; 84 expression x, y; 84 expression x, y; 85 expression min_val; 85 expression min_val; 86 binary operator cmp = {<, <=}; 86 binary operator cmp = {<, <=}; 87 position p; 87 position p; 88 @@ 88 @@ 89 89 90 func(...) 90 func(...) 91 { 91 { 92 <... 92 <... 93 * if ((x) cmp@p (y)) { 93 * if ((x) cmp@p (y)) { 94 * min_val = (x); 94 * min_val = (x); 95 * } else { 95 * } else { 96 * min_val = (y); 96 * min_val = (y); 97 * } 97 * } 98 ...> 98 ...> 99 } 99 } 100 100 101 @pmax depends on patch@ 101 @pmax depends on patch@ 102 identifier func; 102 identifier func; 103 expression x, y; 103 expression x, y; 104 binary operator cmp = {>=, >}; 104 binary operator cmp = {>=, >}; 105 @@ 105 @@ 106 106 107 func(...) 107 func(...) 108 { 108 { 109 <... 109 <... 110 - ((x) cmp (y) ? (x) : (y)) 110 - ((x) cmp (y) ? (x) : (y)) 111 + max(x, y) 111 + max(x, y) 112 ...> 112 ...> 113 } 113 } 114 114 115 @pmaxif depends on patch@ 115 @pmaxif depends on patch@ 116 identifier func; 116 identifier func; 117 expression x, y; 117 expression x, y; 118 expression max_val; 118 expression max_val; 119 binary operator cmp = {>=, >}; 119 binary operator cmp = {>=, >}; 120 @@ 120 @@ 121 121 122 func(...) 122 func(...) 123 { 123 { 124 <... 124 <... 125 - if ((x) cmp (y)) { 125 - if ((x) cmp (y)) { 126 - max_val = x; 126 - max_val = x; 127 - } else { 127 - } else { 128 - max_val = y; 128 - max_val = y; 129 - } 129 - } 130 + max_val = max(x, y); 130 + max_val = max(x, y); 131 ...> 131 ...> 132 } 132 } 133 133 134 @pmin depends on patch@ 134 @pmin depends on patch@ 135 identifier func; 135 identifier func; 136 expression x, y; 136 expression x, y; 137 binary operator cmp = {<=, <}; 137 binary operator cmp = {<=, <}; 138 position p != errcode.p; 138 position p != errcode.p; 139 @@ 139 @@ 140 140 141 func(...) 141 func(...) 142 { 142 { 143 <... 143 <... 144 - ((x) cmp@p (y) ? (x) : (y)) 144 - ((x) cmp@p (y) ? (x) : (y)) 145 + min(x, y) 145 + min(x, y) 146 ...> 146 ...> 147 } 147 } 148 148 149 @pminif depends on patch@ 149 @pminif depends on patch@ 150 identifier func; 150 identifier func; 151 expression x, y; 151 expression x, y; 152 expression min_val; 152 expression min_val; 153 binary operator cmp = {<=, <}; 153 binary operator cmp = {<=, <}; 154 @@ 154 @@ 155 155 156 func(...) 156 func(...) 157 { 157 { 158 <... 158 <... 159 - if ((x) cmp (y)) { 159 - if ((x) cmp (y)) { 160 - min_val = x; 160 - min_val = x; 161 - } else { 161 - } else { 162 - min_val = y; 162 - min_val = y; 163 - } 163 - } 164 + min_val = min(x, y); 164 + min_val = min(x, y); 165 ...> 165 ...> 166 } 166 } 167 167 168 @script:python depends on report@ 168 @script:python depends on report@ 169 p << rmax.p; 169 p << rmax.p; 170 @@ 170 @@ 171 171 172 for p0 in p: 172 for p0 in p: 173 coccilib.report.print_report(p0, "WARN 173 coccilib.report.print_report(p0, "WARNING opportunity for max()") 174 174 175 @script:python depends on org@ 175 @script:python depends on org@ 176 p << rmax.p; 176 p << rmax.p; 177 @@ 177 @@ 178 178 179 for p0 in p: 179 for p0 in p: 180 coccilib.org.print_todo(p0, "WARNING o 180 coccilib.org.print_todo(p0, "WARNING opportunity for max()") 181 181 182 @script:python depends on report@ 182 @script:python depends on report@ 183 p << rmaxif.p; 183 p << rmaxif.p; 184 @@ 184 @@ 185 185 186 for p0 in p: 186 for p0 in p: 187 coccilib.report.print_report(p0, "WARN 187 coccilib.report.print_report(p0, "WARNING opportunity for max()") 188 188 189 @script:python depends on org@ 189 @script:python depends on org@ 190 p << rmaxif.p; 190 p << rmaxif.p; 191 @@ 191 @@ 192 192 193 for p0 in p: 193 for p0 in p: 194 coccilib.org.print_todo(p0, "WARNING o 194 coccilib.org.print_todo(p0, "WARNING opportunity for max()") 195 195 196 @script:python depends on report@ 196 @script:python depends on report@ 197 p << rmin.p; 197 p << rmin.p; 198 @@ 198 @@ 199 199 200 for p0 in p: 200 for p0 in p: 201 coccilib.report.print_report(p0, "WARN 201 coccilib.report.print_report(p0, "WARNING opportunity for min()") 202 202 203 @script:python depends on org@ 203 @script:python depends on org@ 204 p << rmin.p; 204 p << rmin.p; 205 @@ 205 @@ 206 206 207 for p0 in p: 207 for p0 in p: 208 coccilib.org.print_todo(p0, "WARNING o 208 coccilib.org.print_todo(p0, "WARNING opportunity for min()") 209 209 210 @script:python depends on report@ 210 @script:python depends on report@ 211 p << rminif.p; 211 p << rminif.p; 212 @@ 212 @@ 213 213 214 for p0 in p: 214 for p0 in p: 215 coccilib.report.print_report(p0, "WARN 215 coccilib.report.print_report(p0, "WARNING opportunity for min()") 216 216 217 @script:python depends on org@ 217 @script:python depends on org@ 218 p << rminif.p; 218 p << rminif.p; 219 @@ 219 @@ 220 220 221 for p0 in p: 221 for p0 in p: 222 coccilib.org.print_todo(p0, "WARNING o 222 coccilib.org.print_todo(p0, "WARNING opportunity for min()")
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.