def get_sink_args(cfg_node):
if type(cfg_node) == AssignmentNode:
return get_sink_args(cfg_node.ast_node.value)
elif type(cfg_node) == ReturnNode:
return get_sink_args(cfg_node.ast_node.value)
elif isinstance(cfg_node, Node):
return get_sink_args(cfg_node.ast_node)
elif isinstance(cfg_node, ast.Call):
args = list()
for arg in cfg_node.args + cfg_node.keywords:
if isinstance(arg, ast.Name):
args.append(arg.id)
elif isinstance(arg, ast.Str):
args.append(arg.s)
elif isinstance(arg, ast.Call):
args.extend(get_sink_args(arg))
elif isinstance(arg, ast.keyword):
args.append(arg.value)
elif isinstance(arg, ast.Attribute):
import ast_helper
args.append(ast_helper.get_call_names_as_string(arg))
else:
raise Exception('Unexpected argument type:', type(arg))
return args
elif isinstance(cfg_node, ast.Str):
return None
else:
raise Exception('Unexpected node type:', type(cfg_node))
评论列表
文章目录