cppcheck/tools/bisect/bisect_res.py

68 lines
1.8 KiB
Python

#!/usr/bin/env python
import sys
from bisect_common import *
# TODO: detect missing file
def run(cppcheck_path, options):
cmd = options.split()
cmd.insert(0, cppcheck_path)
print('running {}'.format(cppcheck_path))
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
stdout, stderr = p.communicate()
# only 0 and 1 are well-defined in this case
if p.returncode > 1:
print('error')
return None, None, None
# signals are reported as negative exitcode (e.g. SIGSEGV -> -11)
if p.returncode < 0:
print('crash')
return p.returncode, stderr, stdout
print('done')
return p.returncode, stderr, stdout
# TODO: check arguments
bisect_path = sys.argv[1]
options = sys.argv[2]
expected = None
if len(sys.argv) == 4:
expected = sys.argv[3]
if len(expected) == 0:
expected = None
if expected is None:
if '--error-exitcode=1' not in options:
options += ' --error-exitcode=1'
else:
if '--error-exitcode=0' not in options:
options += ' --error-exitcode=0'
try:
cppcheck_path = build_cppcheck(bisect_path)
except Exception as e:
# TODO: how to persist this so we don't keep compiling these
print(e)
sys.exit(EC_SKIP)
run_ec, run_stderr, run_stdout = run(cppcheck_path, options)
if expected is None:
print(run_ec)
print(run_stdout)
print(run_stderr)
# if no ec is set we encountered an unexpected error
if run_ec is None:
sys.exit(EC_SKIP) # error occurred
elif run_ec < 0:
sys.exit(EC_BAD) # crash occurred
# check output for expected string
if expected is not None:
if (expected not in run_stderr) and (expected not in run_stdout):
sys.exit(EC_BAD) # output not found occurred
sys.exit(EC_GOOD) # output found
sys.exit(run_ec) # return the elapsed time - not a result for bisect