1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
import subprocess
import sys
import shlex
import os
import re
os.environ["LC_ALL"] = "C"
os.environ["LANG"] = "C"
for k in list(os.environ.keys()):
if k.startswith("LC_"):
os.environ.pop(k)
if len(sys.argv) < 2:
sys.stderr.write("start as format-test.py gcc-123.45 [-options ...]\n")
sys.exit(1)
c_re = re.compile(r"//\s+(NO)?WARN")
expect = {}
lines = {}
with open("format-test.c", "r") as fd:
for lno, line in enumerate(fd.readlines(), 1):
lines[lno] = line.strip()
m = c_re.search(line)
if m is None:
continue
if m.group(1) is None:
expect[lno] = "warn"
else:
expect[lno] = "nowarn"
cmd = shlex.split(
"-Wall -Wextra -Wno-unused -fplugin=./frr-format.so -fno-diagnostics-show-caret -c -o format-test.o format-test.c"
)
gcc = subprocess.Popen(
sys.argv[1:] + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
sout, serr = gcc.communicate()
gcc.wait()
gcclines = serr.decode("UTF-8").splitlines()
line_re = re.compile(r"^format-test\.c:(\d+):(.*)$")
gcc_warns = {}
for line in gcclines:
if line.find("In function") >= 0:
continue
m = line_re.match(line)
if m is None:
sys.stderr.write("cannot process GCC output: %s\n" % line)
continue
lno = int(m.group(1))
gcc_warns.setdefault(lno, []).append(line)
for lno, val in expect.items():
if val == "nowarn" and lno in gcc_warns:
sys.stderr.write(
"unexpected gcc warning on line %d:\n\t%s\n\t%s\n"
% (lno, lines[lno], "\n\t".join(gcc_warns[lno]))
)
if val == "warn" and lno not in gcc_warns:
sys.stderr.write(
"expected warning on line %d but did not get one\n\t%s\n"
% (lno, lines[lno])
)
leftover = set(gcc_warns.keys()) - set(expect.keys())
for lno in sorted(leftover):
sys.stderr.write(
"unmarked gcc warning on line %d:\n\t%s\n\t%s\n"
% (lno, lines[lno], "\n\t".join(gcc_warns[lno]))
)
|