go-callvis源码是什么

这篇文章主要介绍“go-callvis源码是什么”,在日常操作中,相信很多人在go-callvis源码是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go-callvis源码是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

创新互联公司专注于鄄城企业网站建设,响应式网站设计,商城开发。鄄城网站建设公司,为鄄城等地区提供建站服务。全流程按需求定制网站,专业设计,全程项目跟踪,创新互联公司专业和态度为您提供的服务

go-callvis 是一个可视化调用调用链路图的静态源码分析工具

https://github.com/ofabry/go-callvis

它的实现非常简洁

 examples        handler.go      output.goMakefile        analysis.go     go.mod          images          version.goREADME.md       dot.go          go.sum          main.go

首先看下main.go文件

首先解析了一系列参数然后调用

  Analysis = new(analysis)  if err := Analysis.DoAnalysis("", tests, args); err != nil {    log.Fatal(err)  }

最后起了一个http服务,可以支持在线可视化

type analysis struct {  opts   *renderOpts  prog   *ssa.Program  pkgs   []*ssa.Package  mains  []*ssa.Package  result *pointer.Result}

定义在analysis.go文件里,重点是通过下面这个函数进行代码分析的

func (a *analysis) DoAnalysis(  dir string,  tests bool,  args []string,) error

调用

  "golang.org/x/tools/go/packages"

里面的

  initial, err := packages.Load(cfg, args...)

加载包里面所有的文件,然后调用

"golang.org/x/tools/go/ssa/ssautil"

里面的

  prog, pkgs := ssautil.AllPackages(initial, 0)  prog.Build()

对源码进行ssa转化

然后找到入口的main函数

mains, err := mainPackages(pkgs)

就是判断包名和函数名

 p.Pkg.Name() == "main" && p.Func("main")

然后用

"golang.org/x/tools/go/pointer"

的指针分析,进行依赖分析

result, err := pointer.Analyze(config)

至此,完成了源码的依赖分析,然后应用dot语言,转化成图像。

func outputDot(fname string, outputFormat string) {  // get cmdline default for analysis  Analysis.OptsSetup()
 if e := Analysis.ProcessListArgs(); e != nil {    log.Fatalf("%v\n", e)  }
 output, err := Analysis.Render()

SSA在Go1.7中被引入,这个特性对编译器的性能有很大的提高,但是也导致编译过程有些减速。下面来结合网上的资粮和书籍,简单说明一下SSA以及SSA的应用。

SSA 代表 static single-assignment,是一种IR(中间表示代码),要保证每个变量只被赋值一次。这个能帮助简化编译器的优化算法。

 y := 1
y := 2
x := y

比如上面这段代码,y = 1其实是不可用的,这个要通过定义的可达分析来确定y是要用1还是2,而SSA有一个标识符可以称之为版本或者“代“。

 y1 := 1
y2 := 2
x1 := y2

这样就没有任何间接值了。用SSA表示的好处是对于同一个变量的无关使用表示成不同“代”,可以方便很多编译器的优化算法的实现。

指向分析是一种用于分析指针和内存引用所指向的变量或内存地址的静态代码分析技术。指向分析技术是很多更为复杂的代码分析技术的基础,例如编译优化,代码缺陷检测以及指针修改影响分析。

指向分析,是指通过对源程序的分析近似地求出源程序中指针表达式所指向的目标。

到此,关于“go-callvis源码是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


当前文章:go-callvis源码是什么
浏览路径:http://myzitong.com/article/ggesgj.html