@@ -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
3839def 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+
98136def 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
163201def get_calltree_as_str (cg_extended , k , s1 , depth = 0 , lineno = - 1 , themod = "" , ext_mod = "" ):
0 commit comments