warn.py revision 90d4619f02999ff04483e623f5efb6f998a6c912
1#!/usr/bin/env python 2# This file uses the following encoding: utf-8 3 4import sys 5import re 6 7if len(sys.argv) == 1: 8 print 'usage: ' + sys.argv[0] + ' <build.log>' 9 sys.exit() 10 11# if you add another level, don't forget to give it a color below 12class severity: 13 UNKNOWN=0 14 SKIP=100 15 FIXMENOW=1 16 HIGH=2 17 MEDIUM=3 18 LOW=4 19 TIDY=5 20 HARMLESS=6 21 22def colorforseverity(sev): 23 if sev == severity.FIXMENOW: 24 return 'fuchsia' 25 if sev == severity.HIGH: 26 return 'red' 27 if sev == severity.MEDIUM: 28 return 'orange' 29 if sev == severity.LOW: 30 return 'yellow' 31 if sev == severity.TIDY: 32 return 'peachpuff' 33 if sev == severity.HARMLESS: 34 return 'limegreen' 35 if sev == severity.UNKNOWN: 36 return 'lightblue' 37 return 'grey' 38 39def headerforseverity(sev): 40 if sev == severity.FIXMENOW: 41 return 'Critical warnings, fix me now' 42 if sev == severity.HIGH: 43 return 'High severity warnings' 44 if sev == severity.MEDIUM: 45 return 'Medium severity warnings' 46 if sev == severity.LOW: 47 return 'Low severity warnings' 48 if sev == severity.HARMLESS: 49 return 'Harmless warnings' 50 if sev == severity.TIDY: 51 return 'Clang-Tidy warnings' 52 if sev == severity.UNKNOWN: 53 return 'Unknown warnings' 54 return 'Unhandled warnings' 55 56warnpatterns = [ 57 { 'category':'make', 'severity':severity.MEDIUM, 'members':[], 'option':'', 58 'description':'make: overriding commands/ignoring old commands', 59 'patterns':[r".*: warning: overriding commands for target .+", 60 r".*: warning: ignoring old commands for target .+"] }, 61 { 'category':'C/C++', 'severity':severity.HIGH, 'members':[], 'option':'-Wimplicit-function-declaration', 62 'description':'Implicit function declaration', 63 'patterns':[r".*: warning: implicit declaration of function .+"] }, 64 { 'category':'C/C++', 'severity':severity.SKIP, 'members':[], 'option':'', 65 'description':'', 66 'patterns':[r".*: warning: conflicting types for '.+'"] }, 67 { 'category':'C/C++', 'severity':severity.HIGH, 'members':[], 'option':'-Wtype-limits', 68 'description':'Expression always evaluates to true or false', 69 'patterns':[r".*: warning: comparison is always .+ due to limited range of data type", 70 r".*: warning: comparison of unsigned .*expression .+ is always true", 71 r".*: warning: comparison of unsigned .*expression .+ is always false"] }, 72 { 'category':'C/C++', 'severity':severity.HIGH, 'members':[], 'option':'', 73 'description':'Potential leak of memory, bad free, use after free', 74 'patterns':[r".*: warning: Potential leak of memory", 75 r".*: warning: Potential memory leak", 76 r".*: warning: Memory allocated by .+ should be deallocated by .+ not .+", 77 r".*: warning: 'delete' applied to a pointer that was allocated", 78 r".*: warning: Use of memory after it is freed", 79 r".*: warning: Argument to .+ is the address of .+ variable", 80 r".*: warning: Argument to free\(\) is offset by .+ of memory allocated by", 81 r".*: warning: Attempt to .+ released memory"] }, 82 { 'category':'C/C++', 'severity':severity.HIGH, 'members':[], 'option':'', 83 'description':'Return address of stack memory', 84 'patterns':[r".*: warning: Address of stack memory .+ returned to caller", 85 r".*: warning: Address of stack memory .+ will be a dangling reference"] }, 86 { 'category':'C/C++', 'severity':severity.HIGH, 'members':[], 'option':'', 87 'description':'Problem with vfork', 88 'patterns':[r".*: warning: This .+ is prohibited after a successful vfork", 89 r".*: warning: Call to function 'vfork' is insecure "] }, 90 { 'category':'C/C++', 'severity':severity.HIGH, 'members':[], 'option':'infinite-recursion', 91 'description':'Infinite recursion', 92 'patterns':[r".*: warning: all paths through this function will call itself"] }, 93 { 'category':'C/C++', 'severity':severity.HIGH, 'members':[], 'option':'', 94 'description':'Potential buffer overflow', 95 'patterns':[r".*: warning: Size argument is greater than .+ the destination buffer", 96 r".*: warning: Potential buffer overflow.", 97 r".*: warning: String copy function overflows destination buffer"] }, 98 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 99 'description':'Incompatible pointer types', 100 'patterns':[r".*: warning: assignment from incompatible pointer type", 101 r".*: warning: return from incompatible pointer type", 102 r".*: warning: passing argument [0-9]+ of '.*' from incompatible pointer type", 103 r".*: warning: initialization from incompatible pointer type"] }, 104 { 'category':'C/C++', 'severity':severity.HIGH, 'members':[], 'option':'-fno-builtin', 105 'description':'Incompatible declaration of built in function', 106 'patterns':[r".*: warning: incompatible implicit declaration of built-in function .+"] }, 107 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wunused-parameter', 108 'description':'Unused parameter', 109 'patterns':[r".*: warning: unused parameter '.*'"] }, 110 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wunused', 111 'description':'Unused function, variable or label', 112 'patterns':[r".*: warning: '.+' defined but not used", 113 r".*: warning: unused function '.+'", 114 r".*: warning: private field '.+' is not used", 115 r".*: warning: unused variable '.+'"] }, 116 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wunused-value', 117 'description':'Statement with no effect or result unused', 118 'patterns':[r".*: warning: statement with no effect", 119 r".*: warning: expression result unused"] }, 120 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wunused-result', 121 'description':'Ignoreing return value of function', 122 'patterns':[r".*: warning: ignoring return value of function .+Wunused-result"] }, 123 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wmissing-field-initializers', 124 'description':'Missing initializer', 125 'patterns':[r".*: warning: missing initializer"] }, 126 { 'category':'cont.', 'severity':severity.SKIP, 'members':[], 'option':'', 127 'description':'', 128 'patterns':[r".*: warning: \(near initialization for '.+'\)"] }, 129 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wformat', 130 'description':'Format string does not match arguments', 131 'patterns':[r".*: warning: format '.+' expects type '.+', but argument [0-9]+ has type '.+'", 132 r".*: warning: more '%' conversions than data arguments", 133 r".*: warning: data argument not used by format string", 134 r".*: warning: incomplete format specifier", 135 r".*: warning: format .+ expects .+ but argument .+Wformat=", 136 r".*: warning: field precision should have .+ but argument has .+Wformat", 137 r".*: warning: format specifies type .+ but the argument has .*type .+Wformat"] }, 138 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wformat-extra-args', 139 'description':'Too many arguments for format string', 140 'patterns':[r".*: warning: too many arguments for format"] }, 141 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wformat-invalid-specifier', 142 'description':'Invalid format specifier', 143 'patterns':[r".*: warning: invalid .+ specifier '.+'.+format-invalid-specifier"] }, 144 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wsign-compare', 145 'description':'Comparison between signed and unsigned', 146 'patterns':[r".*: warning: comparison between signed and unsigned", 147 r".*: warning: comparison of promoted \~unsigned with unsigned", 148 r".*: warning: signed and unsigned type in conditional expression"] }, 149 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 150 'description':'Comparison between enum and non-enum', 151 'patterns':[r".*: warning: enumeral and non-enumeral type in conditional expression"] }, 152 { 'category':'libpng', 'severity':severity.MEDIUM, 'members':[], 'option':'', 153 'description':'libpng: zero area', 154 'patterns':[r".*libpng warning: Ignoring attempt to set cHRM RGB triangle with zero area"] }, 155 { 'category':'aapt', 'severity':severity.MEDIUM, 'members':[], 'option':'', 156 'description':'aapt: no comment for public symbol', 157 'patterns':[r".*: warning: No comment for public symbol .+"] }, 158 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wmissing-braces', 159 'description':'Missing braces around initializer', 160 'patterns':[r".*: warning: missing braces around initializer.*"] }, 161 { 'category':'C/C++', 'severity':severity.HARMLESS, 'members':[], 'option':'', 162 'description':'No newline at end of file', 163 'patterns':[r".*: warning: no newline at end of file"] }, 164 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wcast-qual', 165 'description':'Qualifier discarded', 166 'patterns':[r".*: warning: passing argument [0-9]+ of '.+' discards qualifiers from pointer target type", 167 r".*: warning: assignment discards qualifiers from pointer target type", 168 r".*: warning: passing .+ to parameter of type .+ discards qualifiers", 169 r".*: warning: assigning to .+ from .+ discards qualifiers", 170 r".*: warning: return discards qualifiers from pointer target type"] }, 171 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wattributes', 172 'description':'Attribute ignored', 173 'patterns':[r".*: warning: '_*packed_*' attribute ignored"] }, 174 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wattributes', 175 'description':'Visibility mismatch', 176 'patterns':[r".*: warning: '.+' declared with greater visibility than the type of its field '.+'"] }, 177 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 178 'description':'Shift count greater than width of type', 179 'patterns':[r".*: warning: (left|right) shift count >= width of type"] }, 180 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 181 'description':'extern <foo> is initialized', 182 'patterns':[r".*: warning: '.+' initialized and declared 'extern'"] }, 183 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wold-style-declaration', 184 'description':'Old style declaration', 185 'patterns':[r".*: warning: 'static' is not at beginning of declaration"] }, 186 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wuninitialized', 187 'description':'Variable may be used uninitialized', 188 'patterns':[r".*: warning: '.+' may be used uninitialized in this function"] }, 189 { 'category':'C/C++', 'severity':severity.HIGH, 'members':[], 'option':'-Wuninitialized', 190 'description':'Variable is used uninitialized', 191 'patterns':[r".*: warning: '.+' is used uninitialized in this function", 192 r".*: warning: variable '.+' is uninitialized when used here"] }, 193 { 'category':'ld', 'severity':severity.MEDIUM, 'members':[], 'option':'-fshort-enums', 194 'description':'ld: possible enum size mismatch', 195 'patterns':[r".*: warning: .* uses variable-size enums yet the output is to use 32-bit enums; use of enum values across objects may fail"] }, 196 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wpointer-sign', 197 'description':'Pointer targets differ in signedness', 198 'patterns':[r".*: warning: pointer targets in initialization differ in signedness", 199 r".*: warning: pointer targets in assignment differ in signedness", 200 r".*: warning: pointer targets in return differ in signedness", 201 r".*: warning: pointer targets in passing argument [0-9]+ of '.+' differ in signedness"] }, 202 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wstrict-overflow', 203 'description':'Assuming overflow does not occur', 204 'patterns':[r".*: warning: assuming signed overflow does not occur when assuming that .* is always (true|false)"] }, 205 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wempty-body', 206 'description':'Suggest adding braces around empty body', 207 'patterns':[r".*: warning: suggest braces around empty body in an 'if' statement", 208 r".*: warning: empty body in an if-statement", 209 r".*: warning: suggest braces around empty body in an 'else' statement", 210 r".*: warning: empty body in an else-statement"] }, 211 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wparentheses', 212 'description':'Suggest adding parentheses', 213 'patterns':[r".*: warning: suggest explicit braces to avoid ambiguous 'else'", 214 r".*: warning: suggest parentheses around arithmetic in operand of '.+'", 215 r".*: warning: suggest parentheses around comparison in operand of '.+'", 216 r".*: warning: logical not is only applied to the left hand side of this comparison", 217 r".*: warning: using the result of an assignment as a condition without parentheses", 218 r".*: warning: .+ has lower precedence than .+ be evaluated first .+Wparentheses", 219 r".*: warning: suggest parentheses around '.+?' .+ '.+?'", 220 r".*: warning: suggest parentheses around assignment used as truth value"] }, 221 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 222 'description':'Static variable used in non-static inline function', 223 'patterns':[r".*: warning: '.+' is static but used in inline function '.+' which is not static"] }, 224 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wimplicit int', 225 'description':'No type or storage class (will default to int)', 226 'patterns':[r".*: warning: data definition has no type or storage class"] }, 227 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 228 'description':'Null pointer', 229 'patterns':[r".*: warning: Dereference of null pointer", 230 r".*: warning: Called .+ pointer is null", 231 r".*: warning: Forming reference to null pointer", 232 r".*: warning: Returning null reference", 233 r".*: warning: Null pointer passed as an argument to a 'nonnull' parameter", 234 r".*: warning: .+ results in a null pointer dereference", 235 r".*: warning: Access to .+ results in a dereference of a null pointer", 236 r".*: warning: Null pointer argument in"] }, 237 { 'category':'cont.', 'severity':severity.SKIP, 'members':[], 'option':'', 238 'description':'', 239 'patterns':[r".*: warning: type defaults to 'int' in declaration of '.+'"] }, 240 { 'category':'cont.', 'severity':severity.SKIP, 'members':[], 'option':'', 241 'description':'', 242 'patterns':[r".*: warning: parameter names \(without types\) in function declaration"] }, 243 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wstrict-aliasing', 244 'description':'Dereferencing <foo> breaks strict aliasing rules', 245 'patterns':[r".*: warning: dereferencing .* break strict-aliasing rules"] }, 246 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wpointer-to-int-cast', 247 'description':'Cast from pointer to integer of different size', 248 'patterns':[r".*: warning: cast from pointer to integer of different size"] }, 249 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wint-to-pointer-cast', 250 'description':'Cast to pointer from integer of different size', 251 'patterns':[r".*: warning: cast to pointer from integer of different size"] }, 252 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 253 'description':'Symbol redefined', 254 'patterns':[r".*: warning: "".+"" redefined"] }, 255 { 'category':'cont.', 'severity':severity.SKIP, 'members':[], 'option':'', 256 'description':'', 257 'patterns':[r".*: warning: this is the location of the previous definition"] }, 258 { 'category':'ld', 'severity':severity.MEDIUM, 'members':[], 'option':'', 259 'description':'ld: type and size of dynamic symbol are not defined', 260 'patterns':[r".*: warning: type and size of dynamic symbol `.+' are not defined"] }, 261 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 262 'description':'Pointer from integer without cast', 263 'patterns':[r".*: warning: assignment makes pointer from integer without a cast"] }, 264 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 265 'description':'Pointer from integer without cast', 266 'patterns':[r".*: warning: passing argument [0-9]+ of '.+' makes pointer from integer without a cast"] }, 267 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 268 'description':'Integer from pointer without cast', 269 'patterns':[r".*: warning: assignment makes integer from pointer without a cast"] }, 270 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 271 'description':'Integer from pointer without cast', 272 'patterns':[r".*: warning: passing argument [0-9]+ of '.+' makes integer from pointer without a cast"] }, 273 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 274 'description':'Integer from pointer without cast', 275 'patterns':[r".*: warning: return makes integer from pointer without a cast"] }, 276 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wunknown-pragmas', 277 'description':'Ignoring pragma', 278 'patterns':[r".*: warning: ignoring #pragma .+"] }, 279 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wclobbered', 280 'description':'Variable might be clobbered by longjmp or vfork', 281 'patterns':[r".*: warning: variable '.+' might be clobbered by 'longjmp' or 'vfork'"] }, 282 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wclobbered', 283 'description':'Argument might be clobbered by longjmp or vfork', 284 'patterns':[r".*: warning: argument '.+' might be clobbered by 'longjmp' or 'vfork'"] }, 285 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wredundant-decls', 286 'description':'Redundant declaration', 287 'patterns':[r".*: warning: redundant redeclaration of '.+'"] }, 288 { 'category':'cont.', 'severity':severity.SKIP, 'members':[], 'option':'', 289 'description':'', 290 'patterns':[r".*: warning: previous declaration of '.+' was here"] }, 291 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wswitch-enum', 292 'description':'Enum value not handled in switch', 293 'patterns':[r".*: warning: .*enumeration value.* not handled in switch.+Wswitch"] }, 294 { 'category':'java', 'severity':severity.MEDIUM, 'members':[], 'option':'-encoding', 295 'description':'Java: Non-ascii characters used, but ascii encoding specified', 296 'patterns':[r".*: warning: unmappable character for encoding ascii"] }, 297 { 'category':'java', 'severity':severity.MEDIUM, 'members':[], 'option':'', 298 'description':'Java: Non-varargs call of varargs method with inexact argument type for last parameter', 299 'patterns':[r".*: warning: non-varargs call of varargs method with inexact argument type for last parameter"] }, 300 { 'category':'java', 'severity':severity.MEDIUM, 'members':[], 'option':'', 301 'description':'Java: Unchecked method invocation', 302 'patterns':[r".*: warning: \[unchecked\] unchecked method invocation: .+ in class .+"] }, 303 { 'category':'java', 'severity':severity.MEDIUM, 'members':[], 'option':'', 304 'description':'Java: Unchecked conversion', 305 'patterns':[r".*: warning: \[unchecked\] unchecked conversion"] }, 306 { 'category':'aapt', 'severity':severity.MEDIUM, 'members':[], 'option':'', 307 'description':'aapt: No default translation', 308 'patterns':[r".*: warning: string '.+' has no default translation in .*"] }, 309 { 'category':'aapt', 'severity':severity.MEDIUM, 'members':[], 'option':'', 310 'description':'aapt: Missing default or required localization', 311 'patterns':[r".*: warning: \*\*\*\* string '.+' has no default or required localization for '.+' in .+"] }, 312 { 'category':'aapt', 'severity':severity.MEDIUM, 'members':[], 'option':'', 313 'description':'aapt: String marked untranslatable, but translation exists', 314 'patterns':[r".*: warning: string '.+' in .* marked untranslatable but exists in locale '??_??'"] }, 315 { 'category':'aapt', 'severity':severity.MEDIUM, 'members':[], 'option':'', 316 'description':'aapt: empty span in string', 317 'patterns':[r".*: warning: empty '.+' span found in text '.+"] }, 318 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 319 'description':'Taking address of temporary', 320 'patterns':[r".*: warning: taking address of temporary"] }, 321 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 322 'description':'Possible broken line continuation', 323 'patterns':[r".*: warning: backslash and newline separated by space"] }, 324 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Warray-bounds', 325 'description':'Array subscript out of bounds', 326 'patterns':[r".*: warning: array subscript is above array bounds", 327 r".*: warning: Array subscript is undefined", 328 r".*: warning: array subscript is below array bounds"] }, 329 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 330 'description':'Excess elements in initializer', 331 'patterns':[r".*: warning: excess elements in .+ initializer"] }, 332 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 333 'description':'Decimal constant is unsigned only in ISO C90', 334 'patterns':[r".*: warning: this decimal constant is unsigned only in ISO C90"] }, 335 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wmain', 336 'description':'main is usually a function', 337 'patterns':[r".*: warning: 'main' is usually a function"] }, 338 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 339 'description':'Typedef ignored', 340 'patterns':[r".*: warning: 'typedef' was ignored in this declaration"] }, 341 { 'category':'C/C++', 'severity':severity.HIGH, 'members':[], 'option':'-Waddress', 342 'description':'Address always evaluates to true', 343 'patterns':[r".*: warning: the address of '.+' will always evaluate as 'true'"] }, 344 { 'category':'C/C++', 'severity':severity.FIXMENOW, 'members':[], 'option':'', 345 'description':'Freeing a non-heap object', 346 'patterns':[r".*: warning: attempt to free a non-heap object '.+'"] }, 347 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wchar-subscripts', 348 'description':'Array subscript has type char', 349 'patterns':[r".*: warning: array subscript .+ type 'char'.+Wchar-subscripts"] }, 350 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 351 'description':'Constant too large for type', 352 'patterns':[r".*: warning: integer constant is too large for '.+' type"] }, 353 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Woverflow', 354 'description':'Constant too large for type, truncated', 355 'patterns':[r".*: warning: large integer implicitly truncated to unsigned type"] }, 356 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Woverflow', 357 'description':'Overflow in implicit constant conversion', 358 'patterns':[r".*: warning: overflow in implicit constant conversion"] }, 359 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 360 'description':'Declaration does not declare anything', 361 'patterns':[r".*: warning: declaration 'class .+' does not declare anything"] }, 362 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wreorder', 363 'description':'Initialization order will be different', 364 'patterns':[r".*: warning: '.+' will be initialized after", 365 r".*: warning: field .+ will be initialized after .+Wreorder"] }, 366 { 'category':'cont.', 'severity':severity.SKIP, 'members':[], 'option':'', 367 'description':'', 368 'patterns':[r".*: warning: '.+'"] }, 369 { 'category':'cont.', 'severity':severity.SKIP, 'members':[], 'option':'', 370 'description':'', 371 'patterns':[r".*: warning: base '.+'"] }, 372 { 'category':'cont.', 'severity':severity.SKIP, 'members':[], 'option':'', 373 'description':'', 374 'patterns':[r".*: warning: when initialized here"] }, 375 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wmissing-parameter-type', 376 'description':'Parameter type not specified', 377 'patterns':[r".*: warning: type of '.+' defaults to 'int'"] }, 378 { 'category':'gcc', 'severity':severity.MEDIUM, 'members':[], 'option':'', 379 'description':'Invalid option for C file', 380 'patterns':[r".*: warning: command line option "".+"" is valid for C\+\+\/ObjC\+\+ but not for C"] }, 381 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 382 'description':'User warning', 383 'patterns':[r".*: warning: #warning "".+"""] }, 384 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wextra', 385 'description':'Dereferencing void*', 386 'patterns':[r".*: warning: dereferencing 'void \*' pointer"] }, 387 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wextra', 388 'description':'Comparison of pointer to zero', 389 'patterns':[r".*: warning: ordered comparison of pointer with integer zero"] }, 390 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wwrite-strings', 391 'description':'Conversion of string constant to non-const char*', 392 'patterns':[r".*: warning: deprecated conversion from string constant to '.+'"] }, 393 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wstrict-prototypes', 394 'description':'Function declaration isn''t a prototype', 395 'patterns':[r".*: warning: function declaration isn't a prototype"] }, 396 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wignored-qualifiers', 397 'description':'Type qualifiers ignored on function return value', 398 'patterns':[r".*: warning: type qualifiers ignored on function return type", 399 r".*: warning: .+ type qualifier .+ has no effect .+Wignored-qualifiers"] }, 400 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 401 'description':'<foo> declared inside parameter list, scope limited to this definition', 402 'patterns':[r".*: warning: '.+' declared inside parameter list"] }, 403 { 'category':'cont.', 'severity':severity.SKIP, 'members':[], 'option':'', 404 'description':'', 405 'patterns':[r".*: warning: its scope is only this definition or declaration, which is probably not what you want"] }, 406 { 'category':'C/C++', 'severity':severity.LOW, 'members':[], 'option':'-Wcomment', 407 'description':'Line continuation inside comment', 408 'patterns':[r".*: warning: multi-line comment"] }, 409 { 'category':'C/C++', 'severity':severity.LOW, 'members':[], 'option':'-Wcomment', 410 'description':'Comment inside comment', 411 'patterns':[r".*: warning: "".+"" within comment"] }, 412 { 'category':'C/C++', 'severity':severity.LOW, 'members':[], 'option':'', 413 'description':'Value stored is never read', 414 'patterns':[r".*: warning: Value stored to .+ is never read"] }, 415 { 'category':'C/C++', 'severity':severity.LOW, 'members':[], 'option':'-Wdeprecated-declarations', 416 'description':'Deprecated declarations', 417 'patterns':[r".*: warning: .+ is deprecated.+deprecated-declarations"] }, 418 { 'category':'C/C++', 'severity':severity.LOW, 'members':[], 'option':'-Wdeprecated-register', 419 'description':'Deprecated register', 420 'patterns':[r".*: warning: 'register' storage class specifier is deprecated"] }, 421 { 'category':'C/C++', 'severity':severity.LOW, 'members':[], 'option':'-Wpointer-sign', 422 'description':'Converts between pointers to integer types with different sign', 423 'patterns':[r".*: warning: .+ converts between pointers to integer types with different sign"] }, 424 { 'category':'C/C++', 'severity':severity.HARMLESS, 'members':[], 'option':'', 425 'description':'Extra tokens after #endif', 426 'patterns':[r".*: warning: extra tokens at end of #endif directive"] }, 427 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wenum-compare', 428 'description':'Comparison between different enums', 429 'patterns':[r".*: warning: comparison between '.+' and '.+'.+Wenum-compare"] }, 430 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wconversion', 431 'description':'Implicit conversion of negative number to unsigned type', 432 'patterns':[r".*: warning: converting negative value '.+' to '.+'"] }, 433 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 434 'description':'Passing NULL as non-pointer argument', 435 'patterns':[r".*: warning: passing NULL to non-pointer argument [0-9]+ of '.+'"] }, 436 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wctor-dtor-privacy', 437 'description':'Class seems unusable because of private ctor/dtor' , 438 'patterns':[r".*: warning: all member functions in class '.+' are private"] }, 439 # skip this next one, because it only points out some RefBase-based classes where having a private destructor is perfectly fine 440 { 'category':'C/C++', 'severity':severity.SKIP, 'members':[], 'option':'-Wctor-dtor-privacy', 441 'description':'Class seems unusable because of private ctor/dtor' , 442 'patterns':[r".*: warning: 'class .+' only defines a private destructor and has no friends"] }, 443 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wctor-dtor-privacy', 444 'description':'Class seems unusable because of private ctor/dtor' , 445 'patterns':[r".*: warning: 'class .+' only defines private constructors and has no friends"] }, 446 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wgnu-static-float-init', 447 'description':'In-class initializer for static const float/double' , 448 'patterns':[r".*: warning: in-class initializer for static data member of .+const (float|double)"] }, 449 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wpointer-arith', 450 'description':'void* used in arithmetic' , 451 'patterns':[r".*: warning: pointer of type 'void \*' used in (arithmetic|subtraction)", 452 r".*: warning: arithmetic on .+ to void is a GNU extension.*Wpointer-arith", 453 r".*: warning: wrong type argument to increment"] }, 454 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'-Wsign-promo', 455 'description':'Overload resolution chose to promote from unsigned or enum to signed type' , 456 'patterns':[r".*: warning: passing '.+' chooses 'int' over '.* int'"] }, 457 { 'category':'cont.', 'severity':severity.SKIP, 'members':[], 'option':'', 458 'description':'', 459 'patterns':[r".*: warning: in call to '.+'"] }, 460 { 'category':'C/C++', 'severity':severity.HIGH, 'members':[], 'option':'-Wextra', 461 'description':'Base should be explicitly initialized in copy constructor', 462 'patterns':[r".*: warning: base class '.+' should be explicitly initialized in the copy constructor"] }, 463 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 464 'description':'Converting from <type> to <other type>', 465 'patterns':[r".*: warning: converting to '.+' from '.+'"] }, 466 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 467 'description':'VLA has zero or negative size', 468 'patterns':[r".*: warning: Declared variable-length array \(VLA\) has .+ size"] }, 469 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 470 'description':'Return value from void function', 471 'patterns':[r".*: warning: 'return' with a value, in function returning void"] }, 472 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'multichar', 473 'description':'Multi-character character constant', 474 'patterns':[r".*: warning: multi-character character constant"] }, 475 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'writable-strings', 476 'description':'Conversion from string literal to char*', 477 'patterns':[r".*: warning: .+ does not allow conversion from string literal to 'char \*'"] }, 478 { 'category':'C/C++', 'severity':severity.LOW, 'members':[], 'option':'', 479 'description':'Useless specifier', 480 'patterns':[r".*: warning: useless storage class specifier in empty declaration"] }, 481 { 'category':'C/C++', 'severity':severity.LOW, 'members':[], 'option':'-Wduplicate-decl-specifier', 482 'description':'Duplicate declaration specifier', 483 'patterns':[r".*: warning: duplicate '.+' declaration specifier"] }, 484 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'', 485 'description':'Duplicate logtag', 486 'patterns':[r".*: warning: tag \".+\" \(.+\) duplicated in .+"] }, 487 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'typedef-redefinition', 488 'description':'Typedef redefinition', 489 'patterns':[r".*: warning: redefinition of typedef '.+' is a C11 feature"] }, 490 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'gnu-designator', 491 'description':'GNU old-style field designator', 492 'patterns':[r".*: warning: use of GNU old-style field designator extension"] }, 493 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'missing-field-initializers', 494 'description':'Missing field initializers', 495 'patterns':[r".*: warning: missing field '.+' initializer"] }, 496 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'missing-braces', 497 'description':'Missing braces', 498 'patterns':[r".*: warning: suggest braces around initialization of", 499 r".*: warning: too many braces around scalar initializer .+Wmany-braces-around-scalar-init", 500 r".*: warning: braces around scalar initializer"] }, 501 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'sign-compare', 502 'description':'Comparison of integers of different signs', 503 'patterns':[r".*: warning: comparison of integers of different signs.+sign-compare"] }, 504 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'dangling-else', 505 'description':'Add braces to avoid dangling else', 506 'patterns':[r".*: warning: add explicit braces to avoid dangling else"] }, 507 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'initializer-overrides', 508 'description':'Initializer overrides prior initialization', 509 'patterns':[r".*: warning: initializer overrides prior initialization of this subobject"] }, 510 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'self-assign', 511 'description':'Assigning value to self', 512 'patterns':[r".*: warning: explicitly assigning value of .+ to itself"] }, 513 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'gnu-variable-sized-type-not-at-end', 514 'description':'GNU extension, variable sized type not at end', 515 'patterns':[r".*: warning: field '.+' with variable sized type '.+' not at the end of a struct or class"] }, 516 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'tautological-constant-out-of-range-compare', 517 'description':'Comparison of constant is always false/true', 518 'patterns':[r".*: comparison of .+ is always .+Wtautological-constant-out-of-range-compare"] }, 519 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'overloaded-virtual', 520 'description':'Hides overloaded virtual function', 521 'patterns':[r".*: '.+' hides overloaded virtual function"] }, 522 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'incompatible-pointer-types', 523 'description':'Incompatible pointer types', 524 'patterns':[r".*: warning: incompatible pointer types .+Wincompatible-pointer-types"] }, 525 { 'category':'logtags', 'severity':severity.LOW, 'members':[], 'option':'asm-operand-widths', 526 'description':'ASM value size does not match register size', 527 'patterns':[r".*: warning: value size does not match register size specified by the constraint and modifier"] }, 528 { 'category':'C/C++', 'severity':severity.LOW, 'members':[], 'option':'literal-suffix', 529 'description':'Needs a space between literal and string macro', 530 'patterns':[r".*: warning: invalid suffix on literal.+ requires a space .+Wliteral-suffix"] }, 531 { 'category':'C/C++', 'severity':severity.LOW, 'members':[], 'option':'#warnings', 532 'description':'Warnings from #warning', 533 'patterns':[r".*: warning: .+-W#warnings"] }, 534 { 'category':'C/C++', 'severity':severity.LOW, 'members':[], 'option':'absolute-value', 535 'description':'Using float/int absolute value function with int/float argument', 536 'patterns':[r".*: warning: using .+ absolute value function .+ when argument is .+ type .+Wabsolute-value"] }, 537 { 'category':'C/C++', 'severity':severity.LOW, 'members':[], 'option':'', 538 'description':'Refers to implicitly defined namespace', 539 'patterns':[r".*: warning: using directive refers to implicitly-defined namespace .+"] }, 540 { 'category':'C/C++', 'severity':severity.LOW, 'members':[], 'option':'-Winvalid-pp-token', 541 'description':'Invalid pp token', 542 'patterns':[r".*: warning: missing .+Winvalid-pp-token"] }, 543 544 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 545 'description':'Operator new returns NULL', 546 'patterns':[r".*: warning: 'operator new' must not return NULL unless it is declared 'throw\(\)' .+"] }, 547 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 548 'description':'NULL used in arithmetic', 549 'patterns':[r".*: warning: NULL used in arithmetic"] }, 550 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'header-guard', 551 'description':'Misspelled header guard', 552 'patterns':[r".*: warning: '.+' is used as a header guard .+ followed by .+ different macro"] }, 553 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'empty-body', 554 'description':'Empty loop body', 555 'patterns':[r".*: warning: .+ loop has empty body"] }, 556 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'enum-conversion', 557 'description':'Implicit conversion from enumeration type', 558 'patterns':[r".*: warning: implicit conversion from enumeration type '.+'"] }, 559 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'switch', 560 'description':'case value not in enumerated type', 561 'patterns':[r".*: warning: case value not in enumerated type '.+'"] }, 562 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 563 'description':'Undefined result', 564 'patterns':[r".*: warning: The result of .+ is undefined", 565 r".*: warning: 'this' pointer cannot be null in well-defined C\+\+ code;", 566 r".*: warning: shifting a negative signed value is undefined"] }, 567 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 568 'description':'Division by zero', 569 'patterns':[r".*: warning: Division by zero"] }, 570 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 571 'description':'Use of deprecated method', 572 'patterns':[r".*: warning: '.+' is deprecated .+"] }, 573 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 574 'description':'Use of garbage or uninitialized value', 575 'patterns':[r".*: warning: .+ is a garbage value", 576 r".*: warning: Function call argument is an uninitialized value", 577 r".*: warning: Undefined or garbage value returned to caller", 578 r".*: warning: Called .+ pointer is.+uninitialized", 579 r".*: warning: Called .+ pointer is.+uninitalized", # match a typo in compiler message 580 r".*: warning: Use of zero-allocated memory", 581 r".*: warning: Dereference of undefined pointer value", 582 r".*: warning: Passed-by-value .+ contains uninitialized data", 583 r".*: warning: Branch condition evaluates to a garbage value", 584 r".*: warning: The .+ of .+ is an uninitialized value.", 585 r".*: warning: .+ is used uninitialized whenever .+sometimes-uninitialized", 586 r".*: warning: Assigned value is garbage or undefined"] }, 587 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 588 'description':'Result of malloc type incompatible with sizeof operand type', 589 'patterns':[r".*: warning: Result of '.+' is converted to .+ incompatible with sizeof operand type"] }, 590 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 591 'description':'Return value not checked', 592 'patterns':[r".*: warning: The return value from .+ is not checked"] }, 593 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 594 'description':'Possible heap pollution', 595 'patterns':[r".*: warning: .*Possible heap pollution from .+ type .+"] }, 596 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 597 'description':'Allocation size of 0 byte', 598 'patterns':[r".*: warning: Call to .+ has an allocation size of 0 byte"] }, 599 { 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'', 600 'description':'Result of malloc type incompatible with sizeof operand type', 601 'patterns':[r".*: warning: Result of '.+' is converted to .+ incompatible with sizeof operand type"] }, 602 603 { 'category':'C/C++', 'severity':severity.HARMLESS, 'members':[], 'option':'', 604 'description':'Discarded qualifier from pointer target type', 605 'patterns':[r".*: warning: .+ discards '.+' qualifier from pointer target type"] }, 606 { 'category':'C/C++', 'severity':severity.HARMLESS, 'members':[], 'option':'', 607 'description':'Use snprintf instead of sprintf', 608 'patterns':[r".*: warning: .*sprintf is often misused; please use snprintf"] }, 609 { 'category':'C/C++', 'severity':severity.HARMLESS, 'members':[], 'option':'', 610 'description':'Unsupported optimizaton flag', 611 'patterns':[r".*: warning: optimization flag '.+' is not supported"] }, 612 { 'category':'C/C++', 'severity':severity.HARMLESS, 'members':[], 'option':'', 613 'description':'Extra or missing parentheses', 614 'patterns':[r".*: warning: equality comparison with extraneous parentheses", 615 r".*: warning: .+ within .+Wlogical-op-parentheses"] }, 616 { 'category':'C/C++', 'severity':severity.HARMLESS, 'members':[], 'option':'mismatched-tags', 617 'description':'Mismatched class vs struct tags', 618 'patterns':[r".*: warning: '.+' defined as a .+ here but previously declared as a .+mismatched-tags", 619 r".*: warning: .+ was previously declared as a .+mismatched-tags"] }, 620 621 # these next ones are to deal with formatting problems resulting from the log being mixed up by 'make -j' 622 { 'category':'C/C++', 'severity':severity.SKIP, 'members':[], 'option':'', 623 'description':'', 624 'patterns':[r".*: warning: ,$"] }, 625 { 'category':'C/C++', 'severity':severity.SKIP, 'members':[], 'option':'', 626 'description':'', 627 'patterns':[r".*: warning: $"] }, 628 { 'category':'C/C++', 'severity':severity.SKIP, 'members':[], 'option':'', 629 'description':'', 630 'patterns':[r".*: warning: In file included from .+,"] }, 631 632 # warnings from clang-tidy 633 { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'', 634 'description':'clang-tidy readability', 635 'patterns':[r".*: .+\[readability-.+\]$"] }, 636 { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'', 637 'description':'clang-tidy c++ core guidelines', 638 'patterns':[r".*: .+\[cppcoreguidelines-.+\]$"] }, 639 { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'', 640 'description':'clang-tidy google-runtime', 641 'patterns':[r".*: .+\[google-runtime-.+\]$"] }, 642 { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'', 643 'description':'clang-tidy google-build', 644 'patterns':[r".*: .+\[google-build-.+\]$"] }, 645 { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'', 646 'description':'clang-tidy google-explicit', 647 'patterns':[r".*: .+\[google-explicit-.+\]$"] }, 648 { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'', 649 'description':'clang-tidy modernize', 650 'patterns':[r".*: .+\[modernize-.+\]$"] }, 651 { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'', 652 'description':'clang-tidy misc', 653 'patterns':[r".*: .+\[misc-.+\]$"] }, 654 { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'', 655 'description':'clang-tidy CERT', 656 'patterns':[r".*: .+\[cert-.+\]$"] }, 657 { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'', 658 'description':'clang-tidy llvm', 659 'patterns':[r".*: .+\[llvm-.+\]$"] }, 660 { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'', 661 'description':'clang-tidy clang-diagnostic', 662 'patterns':[r".*: .+\[clang-diagnostic-.+\]$"] }, 663 { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'', 664 'description':'clang-tidy clang-analyzer', 665 'patterns':[r".*: .+\[clang-analyzer-.+\]$", 666 r".*: Call Path : .+$"] }, 667 668 # catch-all for warnings this script doesn't know about yet 669 { 'category':'C/C++', 'severity':severity.UNKNOWN, 'members':[], 'option':'', 670 'description':'Unclassified/unrecognized warnings', 671 'patterns':[r".*: warning: .+"] }, 672] 673 674anchor = 0 675cur_row_color = 0 676row_colors = [ 'e0e0e0', 'd0d0d0' ] 677 678def output(text): 679 print text, 680 681def htmlbig(param): 682 return '<font size="+2">' + param + '</font>' 683 684def dumphtmlprologue(title): 685 output('<html>\n<head>\n<title>' + title + '</title>\n<body>\n') 686 output('<a name="PageTop">') 687 output(htmlbig(title)) 688 output('<p>\n') 689 690def tablerow(text): 691 global cur_row_color 692 output('<tr bgcolor="' + row_colors[cur_row_color] + '"><td colspan="2">',) 693 cur_row_color = 1 - cur_row_color 694 output(text,) 695 output('</td></tr>') 696 697def begintable(text, backgroundcolor, extraanchor): 698 global anchor 699 output('<table border="1" rules="cols" frame="box" width="100%" bgcolor="black"><tr bgcolor="' + 700 backgroundcolor + '"><a name="anchor' + str(anchor) + '">') 701 if extraanchor: 702 output('<a name="' + extraanchor + '">') 703 output('<td>') 704 output(htmlbig(text[0]) + '<br>') 705 for i in text[1:]: 706 output(i + '<br>') 707 output('</td>') 708 output('<td width="100" bgcolor="grey">' + 709 '<a align="right" href="#PageTop">top</a><br>' + 710 '<a align="right" href="#anchor' + str(anchor-1) + '">previous</a><br>' + 711 '<a align="right" href="#anchor' + str(anchor+1) + '">next</a>') 712 output('</td></a></tr>') 713 anchor += 1 714 715def endtable(): 716 output('</table><p>') 717 718 719# dump some stats about total number of warnings and such 720def dumpstats(): 721 known = 0 722 unknown = 0 723 for i in warnpatterns: 724 i['members'] = sorted(set(i['members'])) 725 if i['severity'] == severity.UNKNOWN: 726 unknown += len(i['members']) 727 elif i['severity'] != severity.SKIP: 728 known += len(i['members']) 729 output('\nNumber of classified warnings: <b>' + str(known) + '</b><br>' ) 730 output('\nNumber of unclassified warnings: <b>' + str(unknown) + '</b><br>') 731 total = unknown + known 732 output('\nTotal number of warnings: <b>' + str(total) + '</b>') 733 if total < 1000: 734 output('(low count may indicate incremental build)') 735 output('\n<p>\n') 736 737# dump count of warnings of a given severity in TOC 738def dumpcount(sev): 739 first = True 740 for i in warnpatterns: 741 if i['severity'] == sev and len(i['members']) > 0: 742 if first: 743 output(headerforseverity(sev) + ':\n<blockquote>' + 744 '<table border="1" frame="box" width="100%">') 745 output('<tr bgcolor="' + colorforseverity(sev) + '">' + 746 '<td><a href="#' + i['anchor'] + '">' + descriptionfor(i) + 747 ' (' + str(len(i['members'])) + ')</a></td></tr>\n') 748 first = False 749 if not first: 750 output('</table></blockquote>\n') 751 752# dump table of content, list of all warning patterns 753def dumptoc(): 754 n = 1 755 output('<blockquote>\n') 756 for i in warnpatterns: 757 i['anchor'] = 'Warning' + str(n) 758 n += 1 759 dumpcount(severity.FIXMENOW) 760 dumpcount(severity.HIGH) 761 dumpcount(severity.MEDIUM) 762 dumpcount(severity.LOW) 763 dumpcount(severity.TIDY) 764 dumpcount(severity.HARMLESS) 765 dumpcount(severity.UNKNOWN) 766 output('</blockquote>\n<p>\n') 767 768def allpatterns(cat): 769 pats = '' 770 for i in cat['patterns']: 771 pats += i 772 pats += ' / ' 773 return pats 774 775def descriptionfor(cat): 776 if cat['description'] != '': 777 return cat['description'] 778 return allpatterns(cat) 779 780 781# show which warnings no longer occur 782def dumpfixed(): 783 tablestarted = False 784 for i in warnpatterns: 785 if len(i['members']) == 0 and i['severity'] != severity.SKIP: 786 if tablestarted == False: 787 tablestarted = True 788 begintable(['Fixed warnings', 'No more occurences. Please consider turning these in to errors if possible, before they are reintroduced in to the build'], 'blue', '') 789 tablerow(i['description'] + ' (' + allpatterns(i) + ') ' + i['option']) 790 if tablestarted: 791 endtable() 792 793 794# dump a category, provided it is not marked as 'SKIP' and has more than 0 occurrences 795def dumpcategory(cat): 796 if cat['severity'] != severity.SKIP and len(cat['members']) != 0: 797 header = [descriptionfor(cat),str(len(cat['members'])) + ' occurences:'] 798 if cat['option'] != '': 799 header[1:1] = [' (related option: ' + cat['option'] +')'] 800 begintable(header, colorforseverity(cat['severity']), cat['anchor']) 801 for i in cat['members']: 802 tablerow(i) 803 endtable() 804 805 806# dump everything for a given severity 807def dumpseverity(sev): 808 for i in warnpatterns: 809 if i['severity'] == sev: 810 dumpcategory(i) 811 812 813def classifywarning(line): 814 for i in warnpatterns: 815 for cpat in i['compiledpatterns']: 816 if cpat.match(line): 817 i['members'].append(line) 818 return 819 else: 820 # If we end up here, there was a problem parsing the log 821 # probably caused by 'make -j' mixing the output from 822 # 2 or more concurrent compiles 823 pass 824 825# precompiling every pattern speeds up parsing by about 30x 826def compilepatterns(): 827 for i in warnpatterns: 828 i['compiledpatterns'] = [] 829 for pat in i['patterns']: 830 i['compiledpatterns'].append(re.compile(pat)) 831 832infile = open(sys.argv[1], 'r') 833warnings = [] 834 835platformversion = 'unknown' 836targetproduct = 'unknown' 837targetvariant = 'unknown' 838linecounter = 0 839 840warningpattern = re.compile('.* warning:.*') 841compilepatterns() 842 843# read the log file and classify all the warnings 844lastmatchedline = '' 845for line in infile: 846 # replace fancy quotes with plain ol' quotes 847 line = line.replace("‘", "'"); 848 line = line.replace("’", "'"); 849 if warningpattern.match(line): 850 if line != lastmatchedline: 851 classifywarning(line) 852 lastmatchedline = line 853 else: 854 # save a little bit of time by only doing this for the first few lines 855 if linecounter < 50: 856 linecounter +=1 857 m = re.search('(?<=^PLATFORM_VERSION=).*', line) 858 if m != None: 859 platformversion = m.group(0) 860 m = re.search('(?<=^TARGET_PRODUCT=).*', line) 861 if m != None: 862 targetproduct = m.group(0) 863 m = re.search('(?<=^TARGET_BUILD_VARIANT=).*', line) 864 if m != None: 865 targetvariant = m.group(0) 866 867 868# dump the html output to stdout 869dumphtmlprologue('Warnings for ' + platformversion + ' - ' + targetproduct + ' - ' + targetvariant) 870dumpstats() 871dumptoc() 872dumpseverity(severity.FIXMENOW) 873dumpseverity(severity.HIGH) 874dumpseverity(severity.MEDIUM) 875dumpseverity(severity.LOW) 876dumpseverity(severity.TIDY) 877dumpseverity(severity.HARMLESS) 878dumpseverity(severity.UNKNOWN) 879dumpfixed() 880 881