@@ -34,6 +34,7 @@ def main():
34
34
)
35
35
args = parser .parse_args ()
36
36
run_fuzz_pass (args .fuzzer , args .package )
37
+ print ("Done running pass" )
37
38
38
39
def resolve_package (fuzzer_path ):
39
40
"""Resolves the package of a fuzzer"""
@@ -90,11 +91,48 @@ def run_fuzz_pass(fuzzer, package):
90
91
print ("Could not convert calltree to string. Exiting" )
91
92
sys .exit (1 )
92
93
94
+ # Do analysis on the data
95
+ converge_reachables (cg_extended )
96
+ find_all_uses (cg_extended )
97
+
93
98
translated_cg = translate_cg (cg_extended , fuzzer )
94
99
95
100
fuzzer_name = os .path .basename (fuzzer ).replace (".py" , "" )
96
101
dump_fuzz_logic (fuzzer_name , translated_cg , calltree )
97
102
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
+
98
136
def translate_cg (cg_extended , fuzzer_filename ):
99
137
"""Converts the PyCG data into fuzz-introspector data"""
100
138
new_dict = dict ()
@@ -124,8 +162,8 @@ def translate_cg(cg_extended, fuzzer_filename):
124
162
d ['ICount' ] = 0
125
163
d ['EdgeCount' ] = 0
126
164
d ['CyclomaticComplexity' ] = 0
127
- d ['functionsReached' ] = [ ]
128
- d ['functionUses' ] = 13
165
+ d ['functionsReached' ] = elem_dict [ 'all_reachables' ]
166
+ d ['functionUses' ] = elem_dict [ 'all_uses' ]
129
167
d ['BranchProfiles' ] = []
130
168
new_dict ['All functions' ]['Elements' ].append (d )
131
169
return new_dict
@@ -154,10 +192,10 @@ def convert_to_fuzzing_cfg(cg_extended):
154
192
# Extract fuzzer entrypoint and print calltree.
155
193
ep_key = cg_extended ['ep' ]['mod' ] + "." + cg_extended ['ep' ]['name' ]
156
194
ep_node = cg_extended ['cg' ][ep_key ]
157
- print (json .dumps (cg_extended , indent = 4 ))
195
+ # print(json.dumps(cg_extended, indent=4))
158
196
calltree = "Call tree\n "
159
197
calltree += get_calltree_as_str (cg_extended ['cg' ], ep_key , set ())
160
- print (calltree )
198
+ # print(calltree)
161
199
return calltree
162
200
163
201
def get_calltree_as_str (cg_extended , k , s1 , depth = 0 , lineno = - 1 , themod = "" , ext_mod = "" ):
0 commit comments