我在〜/ 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代码进行静态分析? 彼此有任何优点或弱点吗?
答案 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执行的分析类型没有差异。