在Erlang梁上使用Dialyzer和源代码之间有效率差异吗?

时间:2014-04-04 09:18:52

标签: erlang dialyzer

我在〜/ erl_beam

之类的路径下收集项目的所有梁文件
dialyzer ~/erl_beam/*.beam --get_warnings -o static_analysis.log

效果很好。

如果我在Erlang源代码上执行此操作:

dialyzer --get_warnings -I <Path1> --src <Path2> -o static_analysis.log

它也有效。

那么为什么我们有两种方法对Erlang代码进行静态分析? 彼此有任何优点或弱点吗?

2 个答案:

答案 0 :(得分:9)

非常小。

对Core Erlang进行透析器分析。可以直接从+debug_info编译的.beam文件或通过编译.erl文件来提取此表示。编译需要时间,但它当然不是分析中最耗时的部分。

如果您已使用.erl编译了+debug_info,则分析生成的.beam文件也更方便,因为您不必传递任何与编译相关的命令 - Dialyzer的行选项。

答案 1 :(得分:3)

Dialyzer从调试编译的BEAM字节码或Erlang源代码开始分析。但是,有几个选项仅适用于BEAM文件(例如--build_plt)。

例如,如果您无权访问源文件,则可能需要使用BEAM文件。如果您可以访问BEAM和源文件,您可能希望使用BEAM文件,因为这会稍微加快分析速度:Dialyzer将花费更少的时间来解析其输入。另一方面,解析所花费的时间比分析的其余部分少得多,所以不要期望看到太大的差异(如果它超过10%,我会感到惊讶)。

除此之外,AFAIK,在这两种情况之间,Dialyzer执行的分析类型没有差异。