Index: build/toolchain/clang_static_analyzer_wrapper.py |
diff --git a/build/toolchain/clang_static_analyzer_wrapper.py b/build/toolchain/clang_static_analyzer_wrapper.py |
index 3a282ad48d5ae13feabc376a0525ed7f27419289..2a1ef16dee2710ac0eb1ff9dc0840a0ad6a2cca8 100755 |
--- a/build/toolchain/clang_static_analyzer_wrapper.py |
+++ b/build/toolchain/clang_static_analyzer_wrapper.py |
@@ -18,11 +18,11 @@ import wrapper_utils |
# Flags used to enable analysis for Clang invocations. |
analyzer_enable_flags = [ |
'--analyze', |
- '-fdiagnostics-show-option', |
] |
# Flags used to configure the analyzer's behavior. |
analyzer_option_flags = [ |
+ '-fdiagnostics-show-option', |
'-analyzer-checker=cplusplus', |
'-analyzer-opt-analyze-nested-blocks', |
'-analyzer-eagerly-assume', |
@@ -39,37 +39,39 @@ analyzer_option_flags = [ |
] |
-def main(): |
- args = sys.argv[1:] |
- assert args |
+# Prepends every element of a list |args| with |token|. |
+# e.g. ['-analyzer-foo', '-analyzer-bar'] => ['-Xanalyzer', '-analyzer-foo', |
+# '-Xanalyzer', '-analyzer-bar'] |
+def interleave_args(args, token): |
+ return list(sum(zip([token] * len(args), args), ())) |
- # Build the object file and proceed with analysis if it is buildable. |
- returncode, stderr = wrapper_utils.CaptureCommandStderr( |
- wrapper_utils.CommandToRun(args)) |
- sys.stderr.write(stderr) |
- if returncode != 0: |
- return returncode |
- # Now run the analyzer. |
+def main(): |
+ parser = argparse.ArgumentParser() |
+ parser.add_argument('--cl-mode', |
+ help='Uses compiler arguments compatible with clang-cl.', |
+ action='store_true') |
brucedawson
2017/03/14 17:56:38
I'm not familiar enough with the available options
Kevin M
2017/03/14 19:11:03
My thinking was that the layperson would assume th
|
+ parser.add_argument('args', nargs=argparse.REMAINDER) |
+ parsed_args = parser.parse_args() |
- # Interleave 'analyzer_option_flags' flags w/'-Xanalyzer' so that Clang |
- # passes them to the analysis tool. |
- # e.g. ['-analyzer-foo', '-analyzer-bar'] => ['-Xanalyzer', '-analyzer-foo', |
- # '-Xanalyzer', '-analyzer-bar'] |
- interleaved_analyzer_flags = list(sum(zip( |
- ['-Xanalyzer'] * len(analyzer_option_flags), |
- analyzer_option_flags), ())) |
+ # Run the analyzer. |
+ prefix = '-Xclang' if parsed_args.cl_mode else '-Xanalyzer' |
+ cmd = parsed_args.args + analyzer_enable_flags + \ |
+ interleave_args(analyzer_option_flags, prefix) |
returncode, stderr = wrapper_utils.CaptureCommandStderr( |
- wrapper_utils.CommandToRun(args + analyzer_enable_flags + |
- interleaved_analyzer_flags)) |
+ wrapper_utils.CommandToRun(cmd)) |
sys.stderr.write(stderr) |
if returncode != 0: |
sys.stderr.write( |
"""WARNING! The Clang static analyzer exited with error code %d. |
Please share the error details in crbug.com/695243 if this looks like |
a new regression.\n""" % (returncode)) |
+ sys.stderr.write('Falling back to standard build without analysis...\n'); |
+ returncode, stderr = wrapper_utils.CaptureCommandStderr( |
+ wrapper_utils.CommandToRun(parsed_args.args)) |
+ sys.stderr.write(stderr) |
- return 0 |
+ return returncode |
if __name__ == '__main__': |
sys.exit(main()) |