【问题标题】:How do I get dialyzer to ignore certain unexported functions?如何让透析器忽略某些未导出的功能?
【发布时间】:2013-12-22 16:43:47
【问题描述】:

我正在使用贮藏啤酒进行日志记录;它有一个解析器转换,可将lager:warn/1 等函数转换为lager:trace... 函数。

dialyzer 不处理解析器转换,因此会以Call to missing or unexported function lager:warn/1 发出警告。

我如何告诉它这个函数确实存在,而不是警告它?

【问题讨论】:

  • AFAIK 透析器检查光束文件,而不是 src (erl),所以您的 src 文件可能是在没有 parse_transform 标志的情况下编译的?我使用 Erlang r16b01、lager 2.0.0 和透析器,一切正常。
  • "Dialyzer 从调试编译的 BEAM 字节码或 Erlang 源代码开始分析。" -- erlang.org/doc/man/dialyzer.html
  • 我正在使用混凝土中的透析器目标,github.com/opscode/concrete
  • 我检查了混凝土。它工作正常。你确定你添加了-compile([{parse_transform, lager_transform}]).
  • 它在erl_optsapps/Foo/rebar.config

标签: erlang dialyzer


【解决方案1】:

最好的方法是让dialyzer查看你的编译beam文件,只要在编译代码时应用了解析转换并且你在你的.plt文件中包含了lager就可以了

【讨论】:

    【解决方案2】:

    通过查看 meck 项目的 Makefile 中有关透析器的内容,偶然发现了一种方法。看看:Makefile
    关键部分是这样的:

    | \
        fgrep -v -f ./dialyzer.ignore-warnings
    

    所以在该文件中:dialyzer.ignore-warnings 你会看到该怎么做。在我的版本中,我添加了:

    调用丢失或未导出的函数 lager:warning/1
    调用丢失或未导出的函数 lager:warning/2
    调用丢失或未导出的函数 lager:info/1
    调用丢失或未导出的函数 lager:info/2
    调用丢失或未导出的函数 lager:error/1
    调用丢失或未导出的函数 lager:error/2

    我收到的警告消失了。我的 rebar.config 中当然有这个条目:

    {erl_opts, [{parse_transform, lager_transform}]}. 
    

    【讨论】:

    • 这个“解决方案”唯一的问题是退出代码仍然是2,即使没有其他警告
    猜你喜欢
    • 2018-03-10
    • 2019-10-29
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多