问题标签 [dialyzer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
481 浏览

erlang - 使用 typer 注释后运行透析器未显示任何警告

在一个有大约 6000 行 Erlang 代码但没有类型-spec()注释的项目中,我尝试了以下方法:

我用*.erl带注释的文件替换了所有文件并运行

我预计会收到很多警告(第一次运行透析器/打字机组合),但在完成它之后,所有透析器报告的是 user_default 中的 2 个旧调用,同时不存在函数。

没有触发其他默认警告。

我使用它时犯了错误还是这样的结果很常见?

自动注释与typerand的组合dialyzer不是很有用,还是我很幸运,我的代码没有问题?


旁注:我不得不注释掉 3 或 4 -spec()s 因为dialyzer crashed on them

我正在使用来自 Erlang R13B04 的 Dialyzer v2.2.0 和 TypEr 版本 v0.1.7.4

0 投票
3 回答
390 浏览

erlang - Erlang Dialyzer PLT 文件在不同架构之间的可移植性

您可以将 Dialyzer PLT 输出复制并使用到另一台不同架构的机器上吗?例如,我在 x86_64 Linux 机器上构建了一个 PLT 文件。我可以在 x86 FreeBSD 或 Windows 机器上使用该文件吗?

0 投票
1 回答
385 浏览

erlang - 如何忽略 Dialyzer 中的“ifdef(TEST)”?

我尝试像这样使用定义宏标志:dialyzer -dNOTEST,但它不起作用。有没有人有解决方法?

0 投票
1 回答
179 浏览

erlang - erlang 透析器和扩展模块

Dialyzer 不喜欢调用基本模块中的函数。是否有透析器标志可以跳过此错误,或者我做错了什么。

这是一个类似的代码:

这段代码按我预期的方式工作。我唯一担心的是透析器警告;

---.erl:41: 调用丢失或未导出的函数---:---/3

我做错了什么还是透析器发出了不必要的警告?

0 投票
1 回答
193 浏览

erlang - glpkerl (glpk erlang 库) 编译错误

我正在尝试在 Ubuntu 11.10 上编译 glpkerl 库,但到目前为止还没有成功。

由于我一直遇到错误,也许我缺少一些重要的东西:

我试过的

我安装的 Erlang 版本是 R14B02(通过我的发行版的官方 apt 存储库安装)。

由于我的 glpk 版本在官方 repo 中更新,我从这里下载了 glpk-4.38:http: //ftp.gnu.org/gnu/glpk/。我不想在系统范围内安装此版本的 glpk,因此我创建了一个目录 ~/opt,并在以下步骤中将其用作要安装的所有库的根目录。

接下来,我下载 glpkerldrv 并尝试安装它:

显然在使用 make 时出了点问题。如 glpkerl install wiki 所述,我在配置期间使用 --disable-hardcore 禁用了编译器警告到错误的转换。但即便如此,以下未声明的标识符错误仍然存​​在:

显然,生成 handlers.c 文件的 perl 脚本也应该包含limits.h。我通过添加以下内容来纠正它(我没有使用 C 的经验,所以我不确定这是否是正确的方法):

现在建筑工作了(--disable-hardcore虽然我不认为警告会被忽略,但请参阅附件),我可以执行 make、make check 和 make install,我已经这样做了。

我被困在第二部分:

虽然构建似乎工作正常,但由于透析器错误,检查失败:

显然,我们可以将 DIALYZERFLAGS 传递给 makefile,我这样做了:

这是我不确定如何进行的地方

执行最后一条命令后,出现以下错误:

奇怪的是,+debug_info 参数显然被传递给了 erlang 编译器,如 Makefile.opt 文件中所示。

我停止了进一步调查,因为我不确定如何在当前环境下解决这个问题;我在这里遗漏了一些明显的东西吗?谢谢!

(标签:二郎 glpk glpkerl)

0 投票
2 回答
1423 浏览

erlang - 为什么 Dialyzer 没有发现此代码错误?

我根据教程创建了下面的代码片段。最后两行 (feed_squid(FeederRP)feed_red_panda(FeederSquid)) 显然违反了定义的约束,但 Dialyzer 发现它们没问题。这非常令人失望,因为这正是我想要使用执行静态分析的工具捕获的错误类型。

教程中提供了一个解释:

在使用错误类型的馈线调用函数之前,首先使用正确的类型调用它们。从 R15B01 开始,Dialyzer 不会发现此代码有错误。观察到的行为是,只要在函数体内成功调用给定函数,Dialyzer 就会忽略同一代码单元中的后续错误。

这种行为的理由是什么?我知道成功打字背后的哲学是“永远不要哭狼”,但在当前情况下,Dialyzer 显然忽略了有意定义的函数规范(在它看到函数已被正确调用之后)。我了解该代码不会导致运行时崩溃。我能以某种方式强迫 Dialyzer 始终认真对待我的功能规范吗?如果没有,是否有工具可以做到这一点?

0 投票
1 回答
998 浏览

erlang - Erlang:透析器对于一个大项目来说非常慢

Scalaris键值存储是一个包含约 100 个模块的大型 Erlang 项目。我正在这个项目中实施一个新模块,并且对透析器对项目进行一次完整检查需要多长时间感到震惊。在我的机器上运行make dialyzer大约需要 200 秒,这对于实施更改时的频繁测试来说是难以忍受的。

make dialyzer运行以下命令来启动透析器:

我想我应该只能在 的参数列表中包含我的模块所需的文件--src,但是该列表可能非常大,归结为包含给定 100 的 90 个文件。有没有更好的方法来加快速度假设在后续运行之间只有一个模块会发生变化?

0 投票
2 回答
870 浏览

types - 为什么 Dialyzer 告诉我这个有趣的合约有重叠的域?

我正在阅读在线书籍“ learn you some erlang ”并尝试一些练习来检查我的理解。

我在类型规范和 Erlang章节中对 fifo 示例进行了一些修改,试图定义一个“typed_fifo(T)”(所有元素必须是相同类型 T 的 fifo)

我的类型规范是:

-typed_empty_fifo() :: {fifo, [], []}。

-typed_nonempty_fifo(A) :: {fifo, nonempty_list(A), list(A)} | {fifo, [],nonempty_list(A) }。

-typed_fifo(A) :: typed_empty_fifo() | typed_nonempty_fifo(A)。

当我在以下功能规范中使用它时:

-spec 空 (typed_empty_fifo()) -> true;

空({fifo,[],[]})-> 真;

当 is_list(A), is_list(B) -> false 时为空({fifo, A, B})。

Dialyzer 表示由于域重叠,它将忽略规范。

有人可以告诉我我在哪里犯了错误吗?

我还有一点,在尝试定义类型化的 fifo 之前,我有一个运行良好的版本,An Dialyzer 告诉我没有什么可以阻止使用不正确的列表。令人惊讶的是,我没有找到一种简单的方法(我可以在警卫中使用)来测试列表的正确/不正确字符。

真的很奇怪,因为当我使用 bif length/1 时,它会因为 badarg 的原因而失败!

23> L=[1,2|3]。==> [1,2|3]

24> is_list(L)。==> 真

25> 长度(L)。==> 异常错误:参数错误

谢谢

0 投票
1 回答
1071 浏览

erlang - 为什么透析器发现我的类型规范无效?

我是透析器的新手,我希望有人可以通过回答这个问题让我快速了解它的操作。

我认为下面的函数,给定一个数字 X 和一个非负整数 N,会产生一个数字。(X 的 N 次方。)

但是透析器不喜欢我的规格。它告诉我:

在我看来,它所暗示的规范过于包容。有人可以解释它为什么这样做,以及是否有任何方法可以让更严格的类型规范被接受?

0 投票
1 回答
249 浏览

command-line - 来自werl.exe的Erlang透析器?

我尝试dialyzer --help从 werl 命令行运行并挂起。我错过了什么吗?它是否仅适用于 dos shell(我在 XP SP3 上)?