Goland 2024.1新增DFA支持,助力bug检测

发表时间: 2024-03-27 14:06


好和坏

都是风景


DFA是一种静态代码分析的方式,英文名唤做data flow analysis 。她可以在项目未启动的情况下就给我们计算代码里面的一些变量的值,由此可以帮我们发现一些潜在的问题bug。

比如空问题nil ,无限循环endless loop ,不变的条件判断等程序员一般在写代码的时候很难提前发现的问题。

DFA如何实现预测bug

DFA会扫描代码,然后画出一幅图,这幅图表达了代码的执行流程。基于这个图,Goland开始分析变量的值,包括不同时候的变量的实时值,这个过程非常类似我们手动debug 的程序的内心活动。

DFA告诉我们通过手动debug 来发现bug也许太慢了,也不会增加我们对预测bug的能力,同一个人,1年经验和5年经验的时候,对同一个bug的debug 的认知水平需求可能是一样。

但是,通过静态分析就可以提前预测bug,会大大减少大家重复debug 的时间成本。


下面来看看Goland 如何帮我们发现这些bug。


第一个,不变的条件

如上,Goland 在DFA以后,提醒我们err != nil ,因此我们可以认为这个判断是不会执行到的。

因此可以删除这部分多余的代码。

再看一个例子


如上是一个判断条件始终是true,处理方法同上,删掉多余的判断。

判断是程序的基本主题,几乎无处不在,我们在歌颂她的伟大的时候,也不要忘了if else 太多,也会带来代码维护理解上的灾难性的后果。

多余的判断也许不影响业务的能力体现,但是不道德,可能会为后面埋下很多悲剧伏笔。


第二个,nil 提前预测

一个对象的一生至少会面对一次为nil 的时候,正如人的生命一样,nil是一次生命的结束,也是一次新的开始。

nil 以及null,可以说很多bug都来源于他们,也许在我们刚入门一门编程语言时,第一个遇到的问题就是它了吧,以至于成为了一个bug噩梦。

如果借助DFA的分析预测来发现他们,那真是程序员的福音啊。再也不用自己的脑瓜子去花很多时间找bug 的。


由于大部分语言表达空是用null ,那么如果你是其他语言的同学,对应的提示会变成null pointer。

注意,DFA的分析也是需要时间的,所以有时候如果你撸码很快,可能会看到Goland 一些错误的或者不及时的DFA 提示。

如果你也希望少一些麻烦,喜欢Goland的DFA,那就快去尝鲜吧。