Skip to content

Commit 82d7061

Browse files
authored
Merge pull request cms-sw#33870 from gartung/gartung-SA-script-fix
Clean up Utilities/StaticAnalyers scripts to avoid errors because of formatting.
2 parents fd5eb47 + f3747c2 commit 82d7061

File tree

9 files changed

+535
-469
lines changed

9 files changed

+535
-469
lines changed
Lines changed: 57 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,83 @@
11
#! /usr/bin/env python3
22
from __future__ import print_function
3+
import networkx as nx
34
import re
45
import yaml
56

67
topfunc = re.compile(r"::(accumulate|acquire|startingNewLoop|duringLoop|endOfLoop|beginOfJob|endOfJob|produce|analyze|filter|beginLuminosityBlock|beginRun|beginStream|streamBeginRun|streamBeginLuminosityBlock|streamEndRun|streamEndLuminosityBlock|globalBeginRun|globalEndRun|globalBeginLuminosityBlock|globalEndLuminosityBlock|endRun|endLuminosityBlock)\(")
78

8-
baseclass = re.compile(r"edm::(one::|stream::|global::)?(ED(Producer|Filter|Analyzer|(IterateNTimes|NavigateEvents)?Looper)(Base)?|impl::(ExternalWork|Accumulator))")
9+
baseclass = re.compile(
10+
r"edm::(one::|stream::|global::)?(ED(Producer|Filter|Analyzer|(IterateNTimes|NavigateEvents)?Looper)(Base)?|impl::(ExternalWork|Accumulator))")
911
farg = re.compile(r"\(.*?\)")
1012
tmpl = re.compile(r'<.*?>')
1113
toplevelfuncs = set()
1214
epfuncre = re.compile(r"edm::eventsetup::EventSetupRecord::get<.*>\(.*\)")
1315
skipfunc = re.compile(r"TGraph::IsA\(.*\)")
14-
epfuncs=set()
16+
epfuncs = set()
1517

16-
import networkx as nx
17-
G=nx.DiGraph()
18+
G = nx.DiGraph()
1819

19-
#g = open('module_to_package.txt')
20-
#module2package=dict()
21-
#for line in g:
22-
# fields = line.strip().split(';')
23-
# if len(fields) <2:
24-
# continue
25-
# module2package.setdefault(fields[1], []).append(fields[0])
20+
# g = open('module_to_package.txt')
21+
# module2package=dict()
22+
# for line in g:
23+
# fields = line.strip().split(';')
24+
# if len(fields) <2:
25+
# continue
26+
# module2package.setdefault(fields[1], []).append(fields[0])
2627
#
27-
#i = open('module_to_package.yaml', 'w')
28-
#yaml.dump(module2package, i)
29-
#i.close()
28+
# i = open('module_to_package.yaml', 'w')
29+
# yaml.dump(module2package, i)
30+
# i.close()
3031

3132
h = open('module_to_package.yaml', 'r')
32-
module2package=yaml.load(h, Loader=yaml.FullLoader)
33+
module2package = yaml.load(h, Loader=yaml.FullLoader)
3334

3435
with open('function-calls-db.txt') as f:
35-
for line in f :
36-
fields = line.split("'")
36+
for line in f:
37+
fields = line.split("'")
3738
if len(fields) < 3:
3839
continue
39-
if fields[2] == ' calls function ' :
40-
if not skipfunc.search(line) :
41-
G.add_edge(fields[1],fields[3],kind=fields[2])
42-
if epfuncre.search(fields[3]) :
43-
epfuncs.add(fields[3])
44-
if fields[2] == ' overrides function ' :
45-
if baseclass.search(fields[3]) :
46-
if topfunc.search(fields[3]) :
47-
toplevelfuncs.add(fields[1])
48-
G.add_edge(fields[1],fields[3],kind=' overrides function ')
49-
else :
50-
if not skipfunc.search(line) :
51-
G.add_edge(fields[3],fields[1],kind=' calls override function ')
52-
if epfuncre.search(fields[1]) : epfuncs.add(fields[1])
53-
54-
40+
if fields[2] == ' calls function ':
41+
if not skipfunc.search(line):
42+
G.add_edge(fields[1], fields[3], kind=fields[2])
43+
if epfuncre.search(fields[3]):
44+
epfuncs.add(fields[3])
45+
if fields[2] == ' overrides function ':
46+
if baseclass.search(fields[3]):
47+
if topfunc.search(fields[3]):
48+
toplevelfuncs.add(fields[1])
49+
G.add_edge(fields[1], fields[3], kind=' overrides function ')
50+
else:
51+
if not skipfunc.search(line):
52+
G.add_edge(fields[3], fields[1],
53+
kind=' calls override function ')
54+
if epfuncre.search(fields[1]):
55+
epfuncs.add(fields[1])
5556

56-
callstacks=set()
57+
callstacks = set()
5758
for tfunc in toplevelfuncs:
58-
for epfunc in epfuncs:
59-
if G.has_node(tfunc) and G.has_node(epfunc) and nx.has_path(G,tfunc,epfunc) :
60-
path = nx.shortest_path(G,tfunc,epfunc)
61-
cs=str("")
62-
previous=str("")
63-
for p in path :
64-
if epfuncre.search(p): break
65-
stripped=re.sub(farg,"()",p)
66-
if previous != stripped:
67-
cs+=' '+stripped+";"
68-
previous = stripped
69-
callstacks.add(cs)
70-
break
59+
for epfunc in epfuncs:
60+
if G.has_node(tfunc) and G.has_node(epfunc) and nx.has_path(G, tfunc, epfunc):
61+
path = nx.shortest_path(G, tfunc, epfunc)
62+
cs = str("")
63+
previous = str("")
64+
for p in path:
65+
if epfuncre.search(p):
66+
break
67+
stripped = re.sub(farg, "()", p)
68+
if previous != stripped:
69+
cs += ' ' + stripped + ";"
70+
previous = stripped
71+
callstacks.add(cs)
72+
break
7173

7274

73-
report=dict()
75+
report = dict()
7476
for key in sorted(module2package.keys()):
75-
for value in sorted(module2package[key]):
76-
vre=re.compile(' %s::.*();' % value)
77-
for cs in sorted(callstacks):
78-
if vre.search(cs):
79-
report.setdefault(key, {}).setdefault(value, []).append(cs)
80-
r=open('eventsetuprecord-get.yaml', 'w')
81-
yaml.dump(report,r)
77+
for value in sorted(module2package[key]):
78+
vre = re.compile(' %s::.*();' % value)
79+
for cs in sorted(callstacks):
80+
if vre.search(cs):
81+
report.setdefault(key, {}).setdefault(value, []).append(cs)
82+
r = open('eventsetuprecord-get.yaml', 'w')
83+
yaml.dump(report, r)
Lines changed: 82 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
#! /usr/bin/env python3
22
from __future__ import print_function
3+
import networkx as nx
34
import re
45
stdcl = re.compile("^std::(.*)[^>]$")
56
stdptr = re.compile("(.*)_ptr$")
67
datacl = re.compile("^class ")
78
bfunc = re.compile("^function ")
89
mbcl = re.compile("(base|data) class")
9-
farg = re.compile("(.*)\(\w+\)")
10-
nsep = re.compile("\:\:")
11-
topfunc = re.compile("::(produce|analyze|filter|beginLuminosityBlock|beginRun|beginStream)\(")
12-
baseclass = re.compile("edm::(one::|stream::|global::)?ED(Producer|Filter|Analyzer)(Base)?")
13-
getfunc = re.compile("edm::eventsetup::EventSetupRecord::get\<.*\>\((.*)&\) const")
10+
farg = re.compile(r"(.*)\(\w+\)")
11+
nsep = re.compile(r"\:\:")
12+
topfunc = re.compile(
13+
r"::(produce|analyze|filter|beginLuminosityBlock|beginRun|beginStream)\(")
14+
baseclass = re.compile(
15+
"edm::(one::|stream::|global::)?ED(Producer|Filter|Analyzer)(Base)?")
16+
getfunc = re.compile(
17+
r"edm::eventsetup::EventSetupRecord::get\<.*\>\((.*)&\) const")
1418
handle = re.compile("(.*),?class edm::ES(.*)Handle<(.*)>")
1519
statics = set()
1620
toplevelfuncs = set()
@@ -26,82 +30,88 @@
2630
memberclasses = set()
2731
derivedclasses = set()
2832

29-
import networkx as nx
30-
G=nx.DiGraph()
31-
H=nx.DiGraph()
32-
I=nx.DiGraph()
33+
Gdg = nx.DiGraph()
34+
Hdg = nx.DiGraph()
35+
Idg = nx.DiGraph()
3336

3437

3538
f = open('classes.txt.dumperall')
36-
for line in f :
37-
if mbcl.search(line) :
38-
fields = line.split("'")
39-
if fields[2] == ' member data class ':
40-
if not stdcl.search(fields[2]) : H.add_edge(fields[1],fields[3],kind=fields[2])
41-
if fields[2] == ' templated member data class ':
42-
H.add_edge(fields[1],fields[5],kind=fields[3])
43-
if fields[2] == ' base class ':
44-
H.add_edge(fields[1],fields[3],kind=fields[2])
45-
I.add_edge(fields[3],fields[1],kind=' derived class')
39+
for line in f:
40+
if mbcl.search(line):
41+
fields = line.split("'")
42+
if fields[2] == ' member data class ':
43+
if not stdcl.search(fields[2]):
44+
Hdg.add_edge(fields[1], fields[3], kind=fields[2])
45+
if fields[2] == ' templated member data class ':
46+
Hdg.add_edge(fields[1], fields[5], kind=fields[3])
47+
if fields[2] == ' base class ':
48+
Hdg.add_edge(fields[1], fields[3], kind=fields[2])
49+
Idg.add_edge(fields[3], fields[1], kind=' derived class')
4650
f.close()
4751

4852
f = open('function-calls-db.txt')
4953

50-
for line in f :
51-
if not bfunc.search(line) : continue
52-
fields = line.split("'")
53-
if fields[2] == ' calls function ' :
54-
G.add_edge(fields[1],fields[3],kind=' calls function ')
55-
if getfunc.search(fields[3]) :
56-
dataclassfuncs.add(fields[3])
57-
m = getfunc.match(fields[3])
58-
n = handle.match(m.group(1))
59-
if n : o = n.group(3)
60-
else : o = m.group(1)
61-
p = re.sub("class ","",o)
62-
dataclass = re.sub("struct ","",p)
63-
dataclasses.add(dataclass)
64-
if fields[2] == ' overrides function ' :
65-
if baseclass.search(fields[3]) :
66-
G.add_edge(fields[1],fields[3],kind=' overrides function ')
67-
if topfunc.search(fields[3]) : toplevelfuncs.add(fields[1])
68-
else : G.add_edge(fields[3],fields[1], kind=' calls override function ')
69-
if fields[2] == ' static variable ' :
70-
G.add_edge(fields[1],fields[3],kind=' static variable ')
71-
statics.add(fields[3])
54+
for line in f:
55+
if not bfunc.search(line):
56+
continue
57+
fields = line.split("'")
58+
if fields[2] == ' calls function ':
59+
Gdg.add_edge(fields[1], fields[3], kind=' calls function ')
60+
if getfunc.search(fields[3]):
61+
dataclassfuncs.add(fields[3])
62+
m = getfunc.match(fields[3])
63+
n = handle.match(m.group(1))
64+
if n:
65+
o = n.group(3)
66+
else:
67+
o = m.group(1)
68+
p = re.sub("class ", "", o)
69+
dataclass = re.sub("struct ", "", p)
70+
dataclasses.add(dataclass)
71+
if fields[2] == ' overrides function ':
72+
if baseclass.search(fields[3]):
73+
Gdg.add_edge(fields[1], fields[3], kind=' overrides function ')
74+
if topfunc.search(fields[3]):
75+
toplevelfuncs.add(fields[1])
76+
else:
77+
Gdg.add_edge(fields[3], fields[1], kind=' calls override function ')
78+
if fields[2] == ' static variable ':
79+
Gdg.add_edge(fields[1], fields[3], kind=' static variable ')
80+
statics.add(fields[3])
7281
f.close()
7382

7483
visited = set()
7584
nodes = sorted(dataclasses)
7685
for node in nodes:
77-
if node in visited:
78-
continue
79-
visited.add(node)
80-
if node in H : stack = [(node,iter(H[node]))]
81-
if node in I :
82-
Q=nx.dfs_preorder_nodes(I,node)
83-
for q in Q:
84-
print("class '"+q+"'")
85-
if q in H :
86-
stack.append( ( q, iter( H[q] ) ) )
87-
while stack:
88-
parent,children = stack[-1]
89-
print("class '"+parent+"'")
90-
try:
91-
child = next(children)
92-
if child not in visited:
93-
visited.add(child)
94-
if not stdcl.search(child):
95-
print("class '"+child+"'")
96-
stack.append( ( child, iter( H[child] ) ) )
97-
kind=H[parent][child]['kind']
98-
print(parent, kind, child)
99-
if stdptr.search(kind):
100-
if child in I :
101-
Q=nx.dfs_preorder_nodes(I,child)
102-
for q in Q :
103-
print("class '"+q+"'")
104-
if q in H :
105-
stack.append( ( q, iter( H[q] ) ) )
106-
except StopIteration:
107-
stack.pop()
86+
if node in visited:
87+
continue
88+
visited.add(node)
89+
if node in Hdg:
90+
stack = [(node, iter(Hdg[node]))]
91+
if node in Idg:
92+
Qdg = nx.dfs_preorder_nodes(Idg, node)
93+
for q in Qdg:
94+
print("class '"+q+"'")
95+
if q in Hdg:
96+
stack.append((q, iter(Hdg[q])))
97+
while stack:
98+
parent, children = stack[-1]
99+
print("class '"+parent+"'")
100+
try:
101+
child = next(children)
102+
if child not in visited:
103+
visited.add(child)
104+
if not stdcl.search(child):
105+
print("class '"+child+"'")
106+
stack.append((child, iter(Hdg[child])))
107+
kind = Hdg[parent][child]['kind']
108+
print(parent, kind, child)
109+
if stdptr.search(kind):
110+
if child in Idg:
111+
Qdg = nx.dfs_preorder_nodes(Idg, child)
112+
for q in Qdg:
113+
print("class '"+q+"'")
114+
if q in Hdg:
115+
stack.append((q, iter(Hdg[q])))
116+
except StopIteration:
117+
stack.pop()
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
#! /usr/bin/env python3
22

3-
f = open('classes.txt','r')
4-
g = open('classnames.txt','w')
5-
for line in f :
6-
fields = line.split("'")
7-
if fields[0] == 'class ' :
8-
g.write(fields[1]+'\n')
3+
f = open('classes.txt', 'r')
4+
g = open('classnames.txt', 'w')
5+
for line in f:
6+
fields = line.split("'")
7+
if fields[0] == 'class ':
8+
g.write(fields[1]+'\n')
99

1010
f.close()
1111
g.close()

Utilities/StaticAnalyzers/scripts/create_statics_esd_reports.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ sort -u edm-global-classes.txt.unsorted | grep -v -e"^EDM global class " >edm-gl
4848
if [ ! -f ./callgraph.py ]
4949
then
5050
cp -pv ${CMSSW_BASE}/src/Utilities/StaticAnalyzers/scripts/callgraph.py .
51-
cp -pv ${CMSSW_BASE}/src/Utilities/StaticAnalyzers/scripts/modules_to_package.yaml .
51+
cp -pv ${CMSSW_BASE}/src/Utilities/StaticAnalyzers/scripts/module_to_package.yaml .
5252
fi
5353
touch eventsetuprecord-get-all.txt eventsetuprecord-get.txt
5454
./callgraph.py 2>&1 | tee eventsetuprecord-get.txt

0 commit comments

Comments
 (0)