Skip to content

Commit 273c238

Browse files
frontends: python: add reachables extraction logic (#297)
This will fill out the functions-reached and reached-by-functions in data used by the post-processing. This will start to get the analysis properly going, e.g. statistics etc. Ref: #280
1 parent ea506fc commit 273c238

File tree

1 file changed

+42
-4
lines changed

1 file changed

+42
-4
lines changed

frontends/python/main.py

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def main():
3434
)
3535
args = parser.parse_args()
3636
run_fuzz_pass(args.fuzzer, args.package)
37+
print("Done running pass")
3738

3839
def resolve_package(fuzzer_path):
3940
"""Resolves the package of a fuzzer"""
@@ -90,11 +91,48 @@ def run_fuzz_pass(fuzzer, package):
9091
print("Could not convert calltree to string. Exiting")
9192
sys.exit(1)
9293

94+
# Do analysis on the data
95+
converge_reachables(cg_extended)
96+
find_all_uses(cg_extended)
97+
9398
translated_cg = translate_cg(cg_extended, fuzzer)
9499

95100
fuzzer_name = os.path.basename(fuzzer).replace(".py", "")
96101
dump_fuzz_logic(fuzzer_name, translated_cg, calltree)
97102

103+
def find_all_uses(cg_extended):
104+
"""Sets functionUses"""
105+
for elem in cg_extended['cg']:
106+
all_uses = []
107+
for elem2 in cg_extended['cg']:
108+
if elem == elem2:
109+
continue
110+
if elem in cg_extended['cg'][elem2]['all_reachables']:
111+
all_uses.append(elem2)
112+
cg_extended['cg'][elem]['all_uses'] = len(all_uses)
113+
114+
def extract_local_reachables(elem):
115+
print(elem)
116+
s = set()
117+
for dst in elem['dsts']:
118+
s.add(dst['dst'])
119+
return s
120+
121+
def converge_reachables(cg_extended):
122+
"""For each of the elements in the cg_extended cg we converge their reachables"""
123+
for elem in cg_extended['cg']:
124+
print(f"Converging {elem}")
125+
# 'dsts': [{'dst': '<builtin>.type'
126+
all_reachables = set()
127+
ws = extract_local_reachables(cg_extended['cg'][elem])
128+
while len(ws) > 0:
129+
e1 = ws.pop()
130+
if e1 not in all_reachables:
131+
all_reachables.add(e1)
132+
ws = ws.union(extract_local_reachables(cg_extended['cg'][e1]))
133+
#print(elem)
134+
cg_extended['cg'][elem]['all_reachables'] = list(all_reachables)
135+
98136
def translate_cg(cg_extended, fuzzer_filename):
99137
"""Converts the PyCG data into fuzz-introspector data"""
100138
new_dict = dict()
@@ -124,8 +162,8 @@ def translate_cg(cg_extended, fuzzer_filename):
124162
d['ICount'] = 0
125163
d['EdgeCount'] = 0
126164
d['CyclomaticComplexity'] = 0
127-
d['functionsReached'] = []
128-
d['functionUses'] = 13
165+
d['functionsReached'] = elem_dict['all_reachables']
166+
d['functionUses'] = elem_dict['all_uses']
129167
d['BranchProfiles'] = []
130168
new_dict['All functions']['Elements'].append(d)
131169
return new_dict
@@ -154,10 +192,10 @@ def convert_to_fuzzing_cfg(cg_extended):
154192
# Extract fuzzer entrypoint and print calltree.
155193
ep_key = cg_extended['ep']['mod'] + "." + cg_extended['ep']['name']
156194
ep_node = cg_extended['cg'][ep_key]
157-
print(json.dumps(cg_extended, indent=4))
195+
#print(json.dumps(cg_extended, indent=4))
158196
calltree = "Call tree\n"
159197
calltree += get_calltree_as_str(cg_extended['cg'], ep_key, set())
160-
print(calltree)
198+
#print(calltree)
161199
return calltree
162200

163201
def get_calltree_as_str(cg_extended, k, s1, depth=0, lineno=-1, themod="", ext_mod=""):

0 commit comments

Comments
 (0)