cppcheck/test/verify/itc.py

62 lines
1.5 KiB
Python

# Test if --verify works using the itc testsuite
# The itc test suite can be downloaded here:
# https://github.com/regehr/itc-benchmarks
import glob
import os
import re
import sys
import subprocess
ITC_PATH = os.path.expanduser('~/testing')
ZERO_DIVISION = '000/199/329/zero_division.c'
if sys.argv[0] in ('test/verify/itc.py', './test/verify/itc.py'):
CPPCHECK_PATH = './cppcheck'
else:
CPPCHECK_PATH = '../../cppcheck'
def get_error_lines(filename):
ret = []
f = open(filename, 'rt')
lines = f.readlines()
for linenr, line in enumerate(lines):
if line.find('/* ERROR:') > 0:
ret.append(linenr+1)
return ret
def check(filename):
cmd = [CPPCHECK_PATH,
'--verify',
'--platform=unix64',
filename]
print(' '.join(cmd))
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
comm = p.communicate()
stdout = comm[0].decode(encoding='utf-8', errors='ignore')
stderr = comm[1].decode(encoding='utf-8', errors='ignore')
ret = []
for line in stderr.split('\n'):
res = re.match(r'.*zero_division.c:([0-9]+):[0-9]+: error: There is division.*', line)
if res is None:
continue
ret.append(int(res.group(1)))
return ret
filename = os.path.join(ITC_PATH, ZERO_DIVISION)
wanted = get_error_lines(filename)
actual = check(filename)
print('wanted:' + str(wanted))
print('actual:' + str(actual))
missing = []
for w in wanted:
if w not in actual:
missing.append(w);
print('missing:' + str(missing))