Recognize new C/C++ compiler and static analyzer warnings.

Change-Id: I5f47c45498c640702922704aa5305a85e9493fcc
Test: run with Android build.log.
diff --git a/tools/warn.py b/tools/warn.py
index b61505b..6324429 100755
--- a/tools/warn.py
+++ b/tools/warn.py
@@ -68,7 +68,8 @@
                     r".*: warning: ignoring old commands for target .+"] },
     { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'-Wimplicit-function-declaration',
         'description':'Implicit function declaration',
-        'patterns':[r".*: warning: implicit declaration of function .+"] },
+        'patterns':[r".*: warning: implicit declaration of function .+",
+                    r".*: warning: implicitly declaring library function" ] },
     { 'category':'C/C++',   'severity':severity.SKIP,     'members':[], 'option':'',
         'description':'',
         'patterns':[r".*: warning: conflicting types for '.+'"] },
@@ -81,6 +82,7 @@
         'description':'Potential leak of memory, bad free, use after free',
         'patterns':[r".*: warning: Potential leak of memory",
                     r".*: warning: Potential memory leak",
+                    r".*: warning: Memory allocated by alloca\(\) should not be deallocated",
                     r".*: warning: Memory allocated by .+ should be deallocated by .+ not .+",
                     r".*: warning: 'delete' applied to a pointer that was allocated",
                     r".*: warning: Use of memory after it is freed",
@@ -88,13 +90,16 @@
                     r".*: warning: Argument to free\(\) is offset by .+ of memory allocated by",
                     r".*: warning: Attempt to .+ released memory"] },
     { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'',
+        'description':'Use transient memory for control value',
+        'patterns':[r".*: warning: .+Using such transient memory for the control value is .*dangerous."] },
+    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'',
         'description':'Return address of stack memory',
         'patterns':[r".*: warning: Address of stack memory .+ returned to caller",
                     r".*: warning: Address of stack memory .+ will be a dangling reference"] },
     { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'',
         'description':'Problem with vfork',
         'patterns':[r".*: warning: This .+ is prohibited after a successful vfork",
-                    r".*: warning: Call to function 'vfork' is insecure "] },
+                    r".*: warning: Call to function '.+' is insecure "] },
     { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'infinite-recursion',
         'description':'Infinite recursion',
         'patterns':[r".*: warning: all paths through this function will call itself"] },
@@ -112,6 +117,9 @@
     { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'-fno-builtin',
         'description':'Incompatible declaration of built in function',
         'patterns':[r".*: warning: incompatible implicit declaration of built-in function .+"] },
+    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'',
+        'description':'Null passed as non-null argument',
+        'patterns':[r".*: warning: Null passed to a callee that requires a non-null argument"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wunused-parameter',
         'description':'Unused parameter',
         'patterns':[r".*: warning: unused parameter '.*'"] },
@@ -131,15 +139,22 @@
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wmissing-field-initializers',
         'description':'Missing initializer',
         'patterns':[r".*: warning: missing initializer"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wdelete-non-virtual-dtor',
+        'description':'Need virtual destructor',
+        'patterns':[r".*: warning: delete called .* has virtual functions but non-virtual destructor"] },
     { 'category':'cont.',   'severity':severity.SKIP,     'members':[], 'option':'',
         'description':'',
         'patterns':[r".*: warning: \(near initialization for '.+'\)"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'-Wdate-time',
+        'description':'Expansion of data or time macro',
+        'patterns':[r".*: warning: expansion of date or time macro is not reproducible"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wformat',
         'description':'Format string does not match arguments',
         'patterns':[r".*: warning: format '.+' expects type '.+', but argument [0-9]+ has type '.+'",
                     r".*: warning: more '%' conversions than data arguments",
                     r".*: warning: data argument not used by format string",
                     r".*: warning: incomplete format specifier",
+                    r".*: warning: unknown conversion type .* in format",
                     r".*: warning: format .+ expects .+ but argument .+Wformat=",
                     r".*: warning: field precision should have .+ but argument has .+Wformat",
                     r".*: warning: format specifies type .+ but the argument has .*type .+Wformat"] },
@@ -169,28 +184,52 @@
     { 'category':'C/C++',   'severity':severity.HARMLESS, 'members':[], 'option':'',
         'description':'No newline at end of file',
         'patterns':[r".*: warning: no newline at end of file"] },
+    { 'category':'C/C++',   'severity':severity.HARMLESS, 'members':[], 'option':'',
+        'description':'Missing space after macro name',
+        'patterns':[r".*: warning: missing whitespace after the macro name"] },
+    { 'category':'C/C++',   'severity':severity.LOW, 'members':[], 'option':'-Wcast-align',
+        'description':'Cast increases required alignment',
+        'patterns':[r".*: warning: cast from .* to .* increases required alignment .*"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wcast-qual',
         'description':'Qualifier discarded',
         'patterns':[r".*: warning: passing argument [0-9]+ of '.+' discards qualifiers from pointer target type",
                     r".*: warning: assignment discards qualifiers from pointer target type",
                     r".*: warning: passing .+ to parameter of type .+ discards qualifiers",
                     r".*: warning: assigning to .+ from .+ discards qualifiers",
+                    r".*: warning: initializing .+ discards qualifiers .+types-discards-qualifiers",
                     r".*: warning: return discards qualifiers from pointer target type"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wattributes',
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wunknown-attributes',
+        'description':'Unknown attribute',
+        'patterns':[r".*: warning: unknown attribute '.+'"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wignored-attributes',
         'description':'Attribute ignored',
-        'patterns':[r".*: warning: '_*packed_*' attribute ignored"] },
+        'patterns':[r".*: warning: '_*packed_*' attribute ignored",
+                    r".*: warning: attribute declaration must precede definition .+ignored-attributes"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wvisibility',
+        'description':'Visibility problem',
+        'patterns':[r".*: warning: declaration of '.+' will not be visible outside of this function"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wattributes',
         'description':'Visibility mismatch',
         'patterns':[r".*: warning: '.+' declared with greater visibility than the type of its field '.+'"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
         'description':'Shift count greater than width of type',
         'patterns':[r".*: warning: (left|right) shift count >= width of type"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wextern-initializer',
         'description':'extern <foo> is initialized',
-        'patterns':[r".*: warning: '.+' initialized and declared 'extern'"] },
+        'patterns':[r".*: warning: '.+' initialized and declared 'extern'",
+                    r".*: warning: 'extern' variable has an initializer"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wold-style-declaration',
         'description':'Old style declaration',
         'patterns':[r".*: warning: 'static' is not at beginning of declaration"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wreturn-type',
+        'description':'Missing return value',
+        'patterns':[r".*: warning: control reaches end of non-void function"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wimplicit-int',
+        'description':'Implicit int type',
+        'patterns':[r".*: warning: type specifier missing, defaults to 'int'"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wmain-return-type',
+        'description':'Main function should return int',
+        'patterns':[r".*: warning: return type of 'main' is not 'int'"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wuninitialized',
         'description':'Variable may be used uninitialized',
         'patterns':[r".*: warning: '.+' may be used uninitialized in this function"] },
@@ -253,7 +292,8 @@
         'patterns':[r".*: warning: dereferencing .* break strict-aliasing rules"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wpointer-to-int-cast',
         'description':'Cast from pointer to integer of different size',
-        'patterns':[r".*: warning: cast from pointer to integer of different size"] },
+        'patterns':[r".*: warning: cast from pointer to integer of different size",
+                    r".*: warning: initialization makes pointer from integer without a cast"] } ,
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wint-to-pointer-cast',
         'description':'Cast to pointer from integer of different size',
         'patterns':[r".*: warning: cast to pointer from integer of different size"] },
@@ -1326,6 +1366,9 @@
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
         'description':'Possible broken line continuation',
         'patterns':[r".*: warning: backslash and newline separated by space"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wundefined-inline',
+        'description':'Inline function is not defined',
+        'patterns':[r".*: warning: inline function '.*' is not defined"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Warray-bounds',
         'description':'Array subscript out of bounds',
         'patterns':[r".*: warning: array subscript is above array bounds",
@@ -1358,6 +1401,9 @@
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Woverflow',
         'description':'Constant too large for type, truncated',
         'patterns':[r".*: warning: large integer implicitly truncated to unsigned type"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Winteger-overflow',
+        'description':'Overflow in expression',
+        'patterns':[r".*: warning: overflow in expression; .*Winteger-overflow"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Woverflow',
         'description':'Overflow in implicit constant conversion',
         'patterns':[r".*: warning: overflow in implicit constant conversion"] },
@@ -1380,18 +1426,31 @@
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wmissing-parameter-type',
         'description':'Parameter type not specified',
         'patterns':[r".*: warning: type of '.+' defaults to 'int'"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wmissing-declarations',
+        'description':'Missing declarations',
+        'patterns':[r".*: warning: declaration does not declare anything"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wmissing-noreturn',
+        'description':'Missing noreturn',
+        'patterns':[r".*: warning: function '.*' could be declared with attribute 'noreturn'"] },
     { 'category':'gcc',     'severity':severity.MEDIUM,   'members':[], 'option':'',
         'description':'Invalid option for C file',
         'patterns':[r".*: warning: command line option "".+"" is valid for C\+\+\/ObjC\+\+ but not for C"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
         'description':'User warning',
         'patterns':[r".*: warning: #warning "".+"""] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wvexing-parse',
+        'description':'Vexing parsing problem',
+        'patterns':[r".*: warning: empty parentheses interpreted as a function declaration"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wextra',
         'description':'Dereferencing void*',
         'patterns':[r".*: warning: dereferencing 'void \*' pointer"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wextra',
-        'description':'Comparison of pointer to zero',
-        'patterns':[r".*: warning: ordered comparison of pointer with integer zero"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
+        'description':'Comparison of pointer and integer',
+        'patterns':[r".*: warning: ordered comparison of pointer with integer zero",
+                    r".*: warning: .*comparison between pointer and integer"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
+        'description':'Use of error-prone unary operator',
+        'patterns':[r".*: warning: use of unary operator that may be intended as compound assignment"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wwrite-strings',
         'description':'Conversion of string constant to non-const char*',
         'patterns':[r".*: warning: deprecated conversion from string constant to '.+'"] },
@@ -1433,8 +1492,21 @@
         'description':'Comparison between different enums',
         'patterns':[r".*: warning: comparison between '.+' and '.+'.+Wenum-compare"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wconversion',
-        'description':'Implicit conversion of negative number to unsigned type',
-        'patterns':[r".*: warning: converting negative value '.+' to '.+'"] },
+        'description':'Conversion may change value',
+        'patterns':[r".*: warning: converting negative value '.+' to '.+'",
+                    r".*: warning: conversion to '.+' .+ may alter its value"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wconversion-null',
+        'description':'Converting to non-pointer type from NULL',
+        'patterns':[r".*: warning: converting to non-pointer type '.+' from NULL"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wnull-conversion',
+        'description':'Converting NULL to non-pointer type',
+        'patterns':[r".*: warning: implicit conversion of NULL constant to '.+'"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wnon-literal-null-conversion',
+        'description':'Zero used as null pointer',
+        'patterns':[r".*: warning: expression .* zero treated as a null pointer constant"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wliteral-conversion',
+        'description':'Implicit conversion changes value',
+        'patterns':[r".*: warning: implicit conversion .* changes value from .* to .*literal-conversion"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
         'description':'Passing NULL as non-pointer argument',
         'patterns':[r".*: warning: passing NULL to non-pointer argument [0-9]+ of '.+'"] },
@@ -1480,6 +1552,9 @@
     { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'writable-strings',
         'description':'Conversion from string literal to char*',
         'patterns':[r".*: warning: .+ does not allow conversion from string literal to 'char \*'"] },
+    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'-Wextra-semi',
+        'description':'Extra \';\'',
+        'patterns':[r".*: warning: extra ';' .+extra-semi"] },
     { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'',
         'description':'Useless specifier',
         'patterns':[r".*: warning: useless storage class specifier in empty declaration"] },
@@ -1530,6 +1605,12 @@
     { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'asm-operand-widths',
         'description':'ASM value size does not match register size',
         'patterns':[r".*: warning: value size does not match register size specified by the constraint and modifier"] },
+    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'tautological-compare',
+        'description':'Comparison of self is always false',
+        'patterns':[r".*: self-comparison always evaluates to false"] },
+    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'constant-logical-operand',
+        'description':'Logical op with constant operand',
+        'patterns':[r".*: use of logical '.+' with constant operand"] },
     { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'literal-suffix',
         'description':'Needs a space between literal and string macro',
         'patterns':[r".*: warning: invalid suffix on literal.+ requires a space .+Wliteral-suffix"] },
@@ -1538,7 +1619,11 @@
         'patterns':[r".*: warning: .+-W#warnings"] },
     { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'absolute-value',
         'description':'Using float/int absolute value function with int/float argument',
-        'patterns':[r".*: warning: using .+ absolute value function .+ when argument is .+ type .+Wabsolute-value"] },
+        'patterns':[r".*: warning: using .+ absolute value function .+ when argument is .+ type .+Wabsolute-value",
+                    r".*: warning: absolute value function '.+' given .+ which may cause truncation .+Wabsolute-value"] },
+    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'-Wc++11-extensions',
+        'description':'Using C++11 extensions',
+        'patterns':[r".*: warning: 'auto' type specifier is a C\+\+11 extension"] },
     { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'',
         'description':'Refers to implicitly defined namespace',
         'patterns':[r".*: warning: using directive refers to implicitly-defined namespace .+"] },
@@ -1549,9 +1634,10 @@
     { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
         'description':'Operator new returns NULL',
         'patterns':[r".*: warning: 'operator new' must not return NULL unless it is declared 'throw\(\)' .+"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
+    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'-Wnull-arithmetic',
         'description':'NULL used in arithmetic',
-        'patterns':[r".*: warning: NULL used in arithmetic"] },
+        'patterns':[r".*: warning: NULL used in arithmetic",
+                    r".*: warning: comparison between NULL and non-pointer"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'header-guard',
         'description':'Misspelled header guard',
         'patterns':[r".*: warning: '.+' is used as a header guard .+ followed by .+ different macro"] },
@@ -1592,6 +1678,12 @@
     { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
         'description':'Result of malloc type incompatible with sizeof operand type',
         'patterns':[r".*: warning: Result of '.+' is converted to .+ incompatible with sizeof operand type"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'-Wsizeof-array-argument',
+        'description':'Sizeof on array argument',
+        'patterns':[r".*: warning: sizeof on array function parameter will return"] },
+    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'-Wsizeof-pointer-memacces',
+        'description':'Bad argument size of memory access functions',
+        'patterns':[r".*: warning: .+\[-Wsizeof-pointer-memaccess\]"] },
     { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
         'description':'Return value not checked',
         'patterns':[r".*: warning: The return value from .+ is not checked"] },