@@ -83,39 +83,102 @@ def run_fuzz_pass(fuzzer, package):
83
83
cg .analyze ()
84
84
85
85
formatter = formats .Fuzz (cg )
86
- output = formatter .generate ()
86
+ cg_extended = formatter .generate ()
87
+
88
+ calltree = convert_to_fuzzing_cfg (cg_extended )
89
+ if calltree == None :
90
+ print ("Could not convert calltree to string. Exiting" )
91
+ sys .exit (1 )
92
+
93
+ translated_cg = translate_cg (cg_extended , fuzzer )
94
+
95
+ fuzzer_name = os .path .basename (fuzzer ).replace (".py" , "" )
96
+ dump_fuzz_logic (fuzzer_name , translated_cg , calltree )
97
+
98
+ def translate_cg (cg_extended , fuzzer_filename ):
99
+ """Converts the PyCG data into fuzz-introspector data"""
100
+ new_dict = dict ()
101
+ new_dict ['Fuzzer filename' ] = fuzzer_filename
102
+ new_dict ['All functions' ] = dict ()
103
+ new_dict ['All functions' ]['Function list name' ] = "All functions"
104
+ new_dict ['All functions' ]['Elements' ] = []
105
+
106
+ # TODO: do the implementation necessary to carry these out.
107
+ for elem in cg_extended ['cg' ]:
108
+ elem_dict = cg_extended ['cg' ][elem ]
109
+ d = dict ()
110
+ d ['functionName' ] = elem
111
+ d ['functionSourceFile' ] = elem_dict ['meta' ]['modname' ]
112
+ d ['linkageType' ] = "pythonLinkage"
113
+ if 'lineno' in elem_dict ['meta' ]:
114
+ d ['functionLinenumber' ] = elem_dict ['meta' ]['lineno' ]
115
+ else :
116
+ d ['functionLinenumber' ] = - 1
117
+ d ['functionDepth' ] = 0
118
+ d ['returnType' ] = "N/A"
119
+ d ['argCount' ] = 0
120
+ d ['argTypes' ] = []
121
+ d ['constantsTouched' ] = []
122
+ d ['argNames' ] = []
123
+ d ['BBCount' ] = 0
124
+ d ['ICount' ] = 0
125
+ d ['EdgeCount' ] = 0
126
+ d ['CyclomaticComplexity' ] = 0
127
+ d ['functionsReached' ] = []
128
+ d ['functionUses' ] = 13
129
+ d ['BranchProfiles' ] = []
130
+ new_dict ['All functions' ]['Elements' ].append (d )
131
+ return new_dict
132
+
133
+
134
+ def dump_fuzz_logic (fuzzer_name , cg_extended , calltree ):
135
+ import yaml
136
+ calltree_file = fuzzer_name + ".data"
137
+ fuzzer_func_data = fuzzer_name + ".data.yaml"
138
+
139
+ with open (calltree_file , "w+" ) as cf :
140
+ cf .write (calltree )
141
+
142
+ with open (fuzzer_func_data , "w+" ) as ffdf :
143
+ ffdf .write (yaml .dump (cg_extended ))
87
144
88
- convert_to_fuzzing_cfg (output )
89
145
90
146
def convert_to_fuzzing_cfg (cg_extended ):
91
147
"""Utility to translate the CG to something fuzz-introspector post-processing
92
148
can use"""
93
149
print ("Printing CFG output" )
94
150
if "ep" not in cg_extended :
95
151
print ("No entrypoints found" )
96
- return
152
+ return None
97
153
98
154
# Extract fuzzer entrypoint and print calltree.
99
155
ep_key = cg_extended ['ep' ]['mod' ] + "." + cg_extended ['ep' ]['name' ]
100
156
ep_node = cg_extended ['cg' ][ep_key ]
101
157
print (json .dumps (cg_extended , indent = 4 ))
102
- print_calltree (cg_extended ['cg' ], ep_key , set ())
158
+ calltree = "Call tree\n "
159
+ calltree += get_calltree_as_str (cg_extended ['cg' ], ep_key , set ())
160
+ print (calltree )
161
+ return calltree
103
162
104
- def print_calltree (cg_extended , k , s1 , depth = 0 , lineno = - 1 , themod = "" , ext_mod = "" ):
163
+ def get_calltree_as_str (cg_extended , k , s1 , depth = 0 , lineno = - 1 , themod = "" , ext_mod = "" ):
105
164
"""Prints a calltree where k is the key in the cg of the root"""
106
165
107
- if depth > 20 :
108
- return
109
- print ("%s%s src_mod=%s src_linenumber=%d dst_mod=%s" % (" " * (depth * 2 ), k , themod , lineno , ext_mod ))
166
+ #strline = "%s%s src_mod=%s src_linenumber=%d dst_mod=%s\n"%(" "*(depth*2), k, themod, lineno, ext_mod)
167
+ if themod == "" :
168
+ themod = "/"
169
+ strline = "%s%s %s %d\n " % (" " * (depth * 2 ), k , themod , lineno )
170
+ #strline = "%s%s src_mod=%s src_linenumber=%d dst_mod=%s\n"%(" "*(depth*2), k, themod, lineno, ext_mod)
171
+ #print("%s%s src_mod=%s src_linenumber=%d dst_mod=%s"%(" "*(depth*2), k, themod, lineno, ext_mod))
110
172
sorted_keys = sorted (cg_extended [k ]['dsts' ], key = lambda x : x ['lineno' ])
111
173
112
174
# Avoid deep recursions
113
175
if k in s1 :
114
- return
176
+ return strline
115
177
116
178
s1 .add (k )
117
179
for dst in cg_extended [k ]['dsts' ]:
118
- print_calltree (cg_extended , dst ['dst' ], s1 , depth + 1 , dst ['lineno' ], dst ['mod' ], dst ['ext_mod' ])
180
+ strline += get_calltree_as_str (cg_extended , dst ['dst' ], s1 , depth + 1 , dst ['lineno' ], dst ['mod' ], dst ['ext_mod' ])
119
181
182
+ return strline
120
183
if __name__ == "__main__" :
121
184
main ()
0 commit comments