如何找出golang SSA函数return类型

How to find out golang SSA function return type

你好我是静态分析新手,尝试使用golang的SSA包来分析我们的代码。例如我想打印包中的所有功能信息,示例代码是:

dir := PROJECT_PATH
cfg := packages.Config{
    Mode: packages.LoadAllSyntax,
    Dir: dir,
}

initial, _ := packages.Load(&cfg, "./")

// Create SSA packages for well-typed packages and their dependencies.
prog, _ := ssautil.AllPackages(initial, 0)

// Build SSA code for the whole program.
prog.Build()
callGraph = cha.CallGraph(prog)

for f, node := range callGraph.Nodes{
    // f is of ssa.Function 
    fmt.Println("func:", f, f.Name(), f.Syntax(), f.Params)
}

然后我发现我无法访问此函数的 return 值的类型(参考文档 https://pkg.go.dev/golang.org/x/tools/go/ssa#Function) 有什么方法可以用ssa工具或者其他工具分析函数的return值的类型吗?

您可以通过

获得签名,因此return函数类型
 f.Signature.Results()

如果您不需要调用图遍历,您可以直接从 ssa.package struct

获取函数信息
for k, v := range pckg.Members {
   c, ok := v.(*ssa.Function)
   if ok{
    ...
   }
}