查看源码 Dialyzer 发布说明
本文档描述了 Dialyzer 应用程序所做的更改。
Dialyzer 5.3
已修复的错误和故障
修复了
erlang:system_info(logical_processors)
的类型推断。当尝试分析使用
line_coverage
选项编译的模块时,Dialyzer 会崩溃。
改进和新功能
Dialyzer 5.2.1
已修复的错误和故障
现在,
erl
、erlc
、dialyzer
以及 Erlang/OTP 中包含的所有其他程序都提供了手册页。内部编号:OTP-19201 辅助编号:PR-8740
Dialyzer 5.2
改进和新功能
Dialyzer 的
--gui
选项已被删除。内部编号:OTP-18667 辅助编号:PR-7443
文档已迁移为使用 Markdown 和 ExDoc。
内部编号:OTP-18955 辅助编号:PR-8026
Dialyzer 5.1.3
已修复的错误和故障
修复了 UTF-8/16/32 段之后的位串类型推断问题。
内部编号:OTP-19068 辅助编号:GH-8383
Dialyzer 5.1.2
已修复的错误和故障
修复了
dialyzer --output
标志使其正常工作。此选项在 OTP 26.0 中被意外删除。内部编号:OTP-18767 辅助编号:PR-7657
修复了与不透明类型相关的合同检查中的崩溃问题。
内部编号:OTP-18772 辅助编号:GH-7676
Dialyzer 5.1.1
已修复的错误和故障
修复了当分析包含字面原子
undefined
的错误代码(在段大小中)时导致 dialyzer 崩溃的错误。内部编号:OTP-18629 辅助编号:GH-7325
当尝试分析定义了名为
product/
的类型的模块时,Dialyzer 可能会崩溃。内部编号:OTP-18738 辅助编号:GH-7584
Dialyzer 5.1
已修复的错误和故障
当检查行为时,Dialyzer 可能会生成虚假的警告,指出回调函数不具有与行为定义中的规范对应的正确类型。
内部编号:OTP-18237 辅助编号:GH-6221, PR-6243
在规范中,
list(none())
曾经表示none/0
。现在已更正为表示空列表。内部编号:OTP-18276 辅助编号:GH-6333
编译器会默默地接受联合类型中的单例(未绑定)类型变量。从 Erlang/OTP 26 开始,编译器将为此示例生成警告。可以使用
nowarn_singleton_typevar
选项禁用该警告。在 Erlang/OTP 27 中,警告将变为错误。内部编号:OTP-18389 辅助编号:GH-6508, PR-6864, GH-7116
修复了阻止
--plts
选项与--add-to-plt
一起使用的错误。内部编号:OTP-18485 辅助编号:GH-6850, PR-6854
修复了当分析包含非法位串段大小的代码时发生的崩溃问题。
内部编号:OTP-18562
修复了在格式化包含多字节 Unicode 字符的某些警告时发生的崩溃问题。
内部编号:OTP-18564 辅助编号:GH-7153
改进和新功能
Dialyzer 具有新的增量模式,可以通过在运行 Dialyzer 时提供
--incremental
选项来调用。这种新的增量模式很可能在未来的版本中成为默认模式。增量模式与以前的“经典”运行 Dialyzer 的方式的主要区别在于,它的模型围绕定期分析单个代码库、调整代码、再次分析代码等常见用例进行了优化,而无需显式引用 PLT 的构建和检查。
在此模式下,PLT 文件更像是真正的缓存,用户提供一个代码库和他们关心的文件集,Dialyzer 会根据它可能已在 PLT 中缓存的结果,在如何最有效地报告所有相关警告方面进行大量工作(如果 PLT 不存在,增量模式将创建一个)。
内部编号:OTP-18188 辅助编号:PR-5997
Dialyzer 现在为合同违规生成更清晰的错误消息。
内部编号:OTP-18238 辅助编号:PR-6271
内置类型的名称现在可以作为局部类型的名称重用。当 OTP 版本引入新的内置类型时,这将很有用;具有在本地重新定义内置类型的可能性可以更轻松地维护在多个 OTP 版本中工作的代码。
内部编号:OTP-18282 辅助编号:GH-6132, PR-6335
有一个新的选项
-no_spec
,用于忽略所有规范。当怀疑某些规范可能不正确时,它对于调试很有用。内部编号:OTP-18310
Dialyzer 的重载域警告现在默认禁用,可以使用标志
-Woverlapping_contract
启用。Dialyzer 过去会针对重载域发出警告,指出
"此类合同目前不受支持,会被简单地忽略"
。这些合同并非“被忽略”,而是 Dialyzer 取重载域的并集。这意味着我们失去了从每个相应输入到输出类型的依赖关系。因此,此警告实际上是指无法建立每个各自重载函数规范的输入和输出类型之间的依赖关系。
内部编号:OTP-18342 辅助编号:GH-6117, PR-6654
Dialyzer 默认情况下已启用有关未知类型和函数的警告。
在此更改之前,Dialyzer 默认情况下禁用了有关未知类型和函数的警告。
此默认值已被覆盖;Dialyzer 现在会警告未知类型和函数(根据社区在 GH-5695 中的请求)。因此,以下两个示例是等效的,即,默认情况下启用了传递
-Wunknown
函数dialyzer moduler.erl -Wunknown -Wmissing_return
dialyzer moduler.erl -Wmissing_return
Dialyzer 有一个新的标志,
-Wno_unknown
。它的目的是禁止显示有关未知函数和类型的警告。希望禁止显示这些警告的用户可以使用此标志调用 Dialyzer。示例:
dialyzer module.erl -Wno_unknown
* 可能不兼容 *
内部编号:OTP-18439 辅助编号:GH-5695,PR-6822, GH-6942
弃用
dbg:stop_clear/0
,因为它只是dbg:stop/0
的函数别名。内部编号:OTP-18478 辅助编号:GH-6903
添加了 EEP-61 中引入的新内置类型
dynamic/0
,从而改进了对渐进式类型检查器的支持。内部编号:OTP-18522
添加了
argparse
模块,用于简化 escript 和类似程序中的参数处理。内部编号:OTP-18558 辅助编号:PR-6852
Dialyzer 5.0.5
已修复的错误和故障
修复了导致分析崩溃的错误。
内部编号:OTP-18372 辅助编号:GH-6580
改进和新功能
将 size/1 替换为 tuple_size/1 或 byte_size/1
size/1
BIF 不会被 JIT 优化,并且它的使用可能会导致 Dialyzer 的类型更差。当知道被测试的值必须是元组时,应始终首选
tuple_size/1
。当知道被测试的值必须是二进制数据时,应首选
byte_size/1
。但是,byte_size/1
也接受位串(将大小向上舍入到整数个字节),因此必须确保在调用byte_size/
之前调用is_binary/1
,以确保位串被拒绝。请注意,编译器会删除对is_binary/1
的冗余调用,因此,如果不确定之前的代码是否已确保该参数是二进制数据,则在调用byte_size/1
之前立即添加is_binary/1
测试不会造成损害。内部编号:OTP-18432 辅助编号:GH-6672,PR-6793,PR-6784,PR-6787,PR-6785,PR-6682,PR-6800,PR-6797,PR-6798,PR-6799,PR-6796,PR-6813,PR-6671,PR-6673,PR-6684,PR-6694,GH-6677,PR-6696,PR-6670,PR-6674
Dialyzer 5.0.4
已修复的错误和故障
当尝试分析具有字面非整数大小(例如
[]
)的位语法段大小时,Dialyzer 会崩溃。内部编号:OTP-18307 辅助编号:GH-6419, GH-6473
当尝试分析涉及 funs 的复杂嵌套表达式时,Dialyzer 可能会崩溃。
内部编号:OTP-18347 辅助编号:GH-6518, PR-6525
Dialyzer 5.0.3
已修复的错误和故障
当分析使用复杂宏的 Elixir 代码时,Dialyzer 可能会崩溃。
内部编号:OTP-18262 辅助编号:GH-6323
改进和新功能
已添加
--input_list_file
选项。内部编号:OTP-18263 辅助编号:ERIERL-821
Dialyzer 5.0.2
已修复的错误和故障
Dialyzer 在行为检查方面修复了两个错误。
当存在强制性回调函数但未导出时,Dialyzer 不会抱怨缺少回调。
当一个可选的回调函数未导出,并且具有不兼容的参数和/或返回值不兼容时,Dialyzer 会发出警告。 现在已更改为抑制此警告,因为该函数可能不打算作为回调函数使用,例如,如果某个版本添加了一个新的可选回调函数(例如 OTP 25 中为 gen_server 行为添加的
format_status/1
)。内部 ID:OTP-18127 辅助 ID:ERIERL-817
现在可以通过源代码中的
-dialyzer
指令来抑制no_extra_return
和no_missing_return
警告。内部 ID:OTP-18148 辅助 ID:PR-6068
Dialyzer 5.0.1
修复的错误和故障
修复了
missing_return
和extra_return
选项的文档。内部 ID:OTP-18120
Dialyzer 5.0
修复的错误和故障
修复了一个可能导致类型分析器进入无限循环的错误。
* 可能不兼容 *
内部 ID:OTP-17644 辅助 ID:PR-5223
改进和新功能
优化
erl_types
模块中的操作。 并行化 Dialyzer 传递remote
。内部 ID:OTP-17524
添加了
missing_return
和extra_return
选项,以便在规范与推断的类型不同时发出警告。 这些选项与overspecs
和underspecs
类似,但不如它们详细。内部 ID:OTP-17654 辅助 ID:GH-5214
已移除
race_conditions
选项。内部 ID:OTP-17819
plt 的默认位置已从
$HOME
更改为filename:basedir(user_cache,"erlang")
。* 可能不兼容 *
内部 ID:OTP-17821 辅助 ID:GH-5016 PR-5408 OTP-17554
dialyzer
现在将遵循类型声明中的依赖关系。也就是说,如果导出的类型的声明发生更改,将重新访问所有使用该类型的模块。内部 ID:OTP-17826 辅助 ID:PR-5498
Dialyzer 现在更好地理解了
min/2
、max/2
和erlang:raise/3
的类型。 因此,Dialyzer 可能会生成新的警告。 特别是,使用erlang:raise/3
的函数现在可能需要具有no_return/0
返回类型的规范,以避免不必要的警告。内部 ID:OTP-17897 辅助 ID:PR-5651
已添加
typer_core
模块,以提供用于运行typer
的 Erlang API。内部 ID:OTP-17964 辅助 ID:PR-5660
为
typer
添加了--annotate-in-place
选项,该选项可用于将该工具直接推断出的规范注解到源代码文件中。内部 ID:OTP-18035 辅助 ID:PR-5802
Dialyzer 4.4.4.1
改进和新功能
已添加
--input_list_file
选项。内部编号:OTP-18263 辅助编号:ERIERL-821
Dialyzer 4.4.4
修复的错误和故障
当类型是现有类型的子类型,而该现有类型又是未知类型的子类型时,可能会出现关于未知类型的虚假警告。
内部 ID:OTP-17963 辅助 ID:GH-5764
Dialyzer 4.4.3
修复的错误和故障
修复了不透明类型包含某些 Unicode 字符时发生的崩溃。
内部 ID:OTP-17643 辅助 ID:GH-5210
当编译器被 Dialyzer 调用时,它将不再应用二进制模式的优化,该优化会将模式
<<"bar">>
转换为<<6447474:24>>
,这在 Dialyzer 输出时会非常令人困惑。内部 ID:OTP-17768 辅助 ID:GH-5429
Dialyzer 4.4.2
修复的错误和故障
如果 PLT 文件不再存在,则不会崩溃。
内部 ID:OTP-17511 辅助 ID:GH-4501
修复了与映射相关的
erl_types
中的错误。内部 ID:OTP-17537
修复了关于不正确列表的
erl_types
中的错误。内部 ID:OTP-17541
underspecs
和overspecs
选项现在将为滥用的不透明类型生成正确的警告。内部 ID:OTP-17616 辅助 ID:GH-5118
Dialyzer 4.4.1
修复的错误和故障
如果存在其他位置可供使用,则不在消息中显示行号
0
。内部 ID:OTP-17443 辅助 ID:GH-4890
在极少数情况下,Dialyzer 可能会在分析带有被忽略其值的列表推导的代码时崩溃。(感谢 Ulf Wiger 报告了这个错误。)
内部 ID:OTP-17482
Dialyzer 4.4
改进和新功能
一些内部 HiPE 模块已移至 dialyzer 应用程序中,以便在禁用 HiPE 时 dialyzer 也能工作。
内部 ID:OTP-16883
实验性的 HiPE 应用程序以及其他应用程序中的所有相关功能均已移除。
* 可能不兼容 *
内部 ID:OTP-16963
添加警告选项
no_underspecs
。内部 ID:OTP-16986 辅助 ID:ERL-1379、ERL-1480、GH-4033
报告因
-Wunknown
选项而返回的警告的文件名和位置。 从命令行使用时,每个文件会打印一个位置。内部 ID:OTP-16995 辅助 ID:ERL-1348
添加用于文档的类型和规范。
内部 ID:OTP-17084
添加选项
error_location
。 如果包含在环境变量 ERL_COMPILER_OPTIONS 中,则会识别该选项。内部 ID:OTP-17177 辅助 ID:OTP-16824
阐明如何声明匹配模式中使用的记录。
内部 ID:OTP-17183 辅助 ID:ERL-892、GH-4493
Dialyzer 4.3.1.2
改进和新功能
已添加
--input_list_file
选项。内部编号:OTP-18263 辅助编号:ERIERL-821
Dialyzer 4.3.1.1
修复的错误和故障
在极少数情况下,Dialyzer 可能会在分析带有被忽略其值的列表推导的代码时崩溃。(感谢 Ulf Wiger 报告了这个错误。)
内部 ID:OTP-17482
Dialyzer 4.3.1
修复的错误和故障
正确处理 GUI 中的 PLT。
内部 ID:OTP-17091
Dialyzer 4.3
改进和新功能
在
dialyzer
中阐明警告选项-Wunmatched_returns
。内部 ID:OTP-17068 辅助 ID:ERL-1223
Dialyzer 4.2.1
修复的错误和故障
在极少数情况下,dialyzer 在分析列表推导时会崩溃。
内部 ID:OTP-16813 辅助 ID:ERL-1307
Dialyzer 4.2
改进和新功能
改进了
maps:remove/2
的处理。内部 ID:OTP-16055 辅助 ID:ERL-1002
Dialyzer 4.1.1
修复的错误和故障
修复了错误地发出关于过度指定函数的警告的错误。 只有重载函数才会受到此错误的影响。
内部 ID:OTP-16292
改进和新功能
移除带有 GNU 许可的测试数据。
内部 ID:OTP-16146
Dialyzer 4.1
改进和新功能
允许在使用 Erlang 中的 Dialyzer 时进行本机编译。 已添加
native
(默认为false
)和native_cache
选项。内部 ID:OTP-15880 辅助 ID:PR-2283
Dialyzer 4.0.3
修复的缺陷和故障
HiPE 编译器会错误地编译某些 try/catch 表达式,因此现在它会拒绝编译包含 try 或 catch 的模块。
因此,
dialyzer
将不再把关键模块编译为本机代码。* 可能不兼容 *
自有 ID: OTP-15949
Dialyzer 4.0.2
修复的缺陷和故障
确保当结果格式化失败时,Dialyzer 不会崩溃。它将返回未格式化的结果,而不是崩溃。
自有 ID: OTP-15922 辅助 ID: PR-2240, ERL-949
Dialyzer 4.0.1
修复的缺陷和故障
修复了当缩进提到多个记录字段的 Dialyzer 警告时导致崩溃的错误。
自有 ID: OTP-15861 辅助 ID: ERL-953
Dialyzer 4.0
修复的缺陷和故障
所有在源代码注释、文档、示例等中不正确的 "can not" 用法都已更正为 "cannot"。
自有 ID: OTP-14282 辅助 ID: PR-1891
改进和新功能
默认情况下,Dialyzer 在格式化结果时,会在类型、契约和 Erlang 代码中插入换行符。使用新的
--no_indentation
选项可以获得不插入换行符的旧行为。自有 ID: OTP-15135
为了提高可读性,在警告中使用位语法,而不是 Core Erlang 语法。
自有 ID: OTP-15752
标记为
fun_app_args
的原始分析结果的格式更改为{fun_app_args, [ArgNs, Args, Type]}
。* 可能不兼容 *
自有 ID: OTP-15779
Dialyzer 3.3.2
修复的缺陷和故障
修复了当分析的契约的模块名称与被分析模块的名称不同时,导致 Dialyzer 崩溃的错误。该错误是在 Erlang/OTP 18 中引入的。
自有 ID: OTP-15562 辅助 ID: ERL-845
修复了
lists:{keysearch, keyfind, keymember}
的Key
参数处理中的错误。自有 ID: OTP-15570
(再次)优化了 Dialyzer 对 guards 中左结合的
andalso
和orelse
的处理。自有 ID: OTP-15577 辅助 ID: ERL-851, PR-2141, PR-1944
Dialyzer 3.3.1
改进和新功能
优化了 Dialyzer 对 guards 中左结合的
andalso
和orelse
的处理。自有 ID: OTP-15268 辅助 ID: ERL-680
Dialyzer 3.3
改进和新功能
更改了
.erlang
加载的默认行为:不再从当前目录加载.erlang
。c:erlangrc(PathList)
可用于从用户指定的目录中搜索和加载.erlang
文件。escript
、erlc
、dialyzer
和typer
将不再加载.erlang
文件。* 可能不兼容 *
自有 ID: OTP-14439
Dialyzer 不再读取使用 OTP 19 或更早版本创建的 BEAM 文件。
自有 ID: OTP-14493 辅助 ID: PR-1434
加快了 MD5 校验和的计算速度。
自有 ID: OTP-14937 辅助 ID: PR-1719
修复了 Dialyzer 不必要地丢弃契约信息,导致遗漏警告的情况。
自有 ID: OTP-14970 辅助 ID: PR-1722
(不推荐的)选项
-Woverspecs
有所改进,并在更多情况下生成警告。自有 ID: OTP-14982 辅助 ID: OTP-14970, PR-1722
不要为驻留在无法运行的代码中的 fun 表达式发出警告。这与 Dialyzer 处理其他无法运行的代码的方式一致。
自有 ID: OTP-15079 辅助 ID: ERL-593
Dialyzer 3.2.4
修复的缺陷和故障
修复了关于
erlang:abs/1
和erlang:bsl/2
的错误。自有 ID: OTP-14858 辅助 ID: ERL-551
修复了导致 Dialyzer 崩溃而不是发出警告的错误。
自有 ID: OTP-14911
修复了关于参数化不透明类型的错误。
自有 ID: OTP-14925 辅助 ID: ERL-565
Dialyzer 3.2.3
修复的缺陷和故障
当例如修改后的记录字段类型不是声明类型的子类型时,Dialyzer 返回的错误消息不再包含调用堆栈。该错误是在 Erlang/OTP 19.3 中引入的。
自有 ID: OTP-14742
修复了与 map 和永不返回函数相关的错误。
自有 ID: OTP-14743
Dialyzer 3.2.2
修复的缺陷和故障
修复了导致 Dialyzer 进入无限循环的关于 map 类型的错误。此修复的一个结果是,诸如 map 和元组之类的复合 map 键的处理有时不如以前精确。
自有 ID: OTP-14572 辅助 ID: seq13319
改进和新功能
通用的 Unicode 改进。
自有 ID: OTP-14462
改进了对未知远程类型的检查。
自有 ID: OTP-14606 辅助 ID: OTP-14218
Dialyzer 3.2.1
修复的缺陷和故障
修复了合并 PLT 时可能丢失信息的错误。该错误是在 Erlang/OTP 20.0 中引入的。
自有 ID: OTP-14558 辅助 ID: ERIERL-53
Dialyzer 3.2
修复的缺陷和故障
在 Erlang/OTP 18 中错误地删除了对类型声明中错误类型变量的检查,现在已重新引入。
自有 ID: OTP-14423 辅助 ID: OTP-14323
改进和新功能
现在分析具有巨大字符串的二进制构造的模块要快得多。编译器编译此类模块的速度也稍快。
自有 ID: OTP-14125 辅助 ID: ERL-308
峰值内存消耗已减少。
自有 ID: OTP-14127
现在,对于任何函数规范未使用的类型,也会生成关于未知类型的警告。
自有 ID: OTP-14218 辅助 ID: OTP-14127
TypEr 已作为单独的应用程序被删除,现在是 Dialyzer 应用程序的一部分。TypEr 的文档已添加到 Dialyzer 应用程序中。
自有 ID: OTP-14336
存储在 BEAM 文件中的调试信息格式(使用
debug_info
时)已更改。此更改的目的是更好地支持其他基于 BEAM 的语言,如 Elixir 或 LFE。OTP 中包含的所有工具(dialyzer、debugger、cover 等)都将处理新格式和之前的格式。使用
beam_lib:chunk(Beam, [abstract_code])
检索调试信息的工具将继续使用新旧格式。调用beam_lib:chunk(Beam, ["Abst"])
的工具将无法使用新格式。有关详细信息,请参阅
beam_lib
文档中对debug_info
的描述以及compile
文档中对{debug_info,{Backend,Data}}
选项的描述。自有 ID: OTP-14369 辅助 ID: PR-1367
Dialyzer 3.1.1
修复的缺陷和故障
正确报告未知类型。在 Erlang/OTP 19.3 中引入了一个错误,该错误导致关于未知类型的警告被简单地丢弃。
自有 ID: OTP-14368
Dialyzer 3.1
修复的缺陷和故障
修复了关于参数化不透明类型的错误。
自有 ID: OTP-14130
改进了一些警告。其中一个可能导致崩溃。
自有 ID: OTP-14177
dialyzer 和 observer 应用程序现在将使用一种可移植的方式来查找主目录。这意味着不再需要在 Windows 上手动设置 HOME 环境变量。
自有 ID: OTP-14249 辅助 ID: ERL-161
改进和新功能
峰值内存消耗已减少。
优化了
dialyzer_typesig
中巨大 SCC 的评估。现在分析具有巨大字符串的二进制构造的模块要快得多。
自有 ID: OTP-14126 辅助 ID: ERL-308
Dialyzer 3.0.3
修复的缺陷和故障
修复了关于不透明类型的错误。
自有 ID: OTP-13693
修复了错误
-dialyzer()
属性的错误处理。自有 ID: OTP-13979 辅助 ID: ERL-283
改进和新功能
改进了一些警告消息。
自有 ID: OTP-11403
Dialyzer 3.0.2
改进和新功能
在某些情况下,改进了对不透明类型的 form 到类型的转换。
自有 ID: OTP-13682
为编译器生成的 case 语句添加了警告抑制。除非没有子句返回,否则会抑制关于无法匹配且也是编译器生成的子句的警告。
自有 ID: OTP-13723 辅助 ID: ERL-159, PR-1121
Dialyzer 3.0.1
修复的缺陷和故障
修复了与 map 相关的错误。
自有 ID: OTP-13709 辅助 ID: ERL-177, PR-1115
Dialyzer 3.0
修复的缺陷和故障
修复了 form 到类型的转换中的错误。
自有 ID: OTP-13520
更正 Dialyzer 缩写定义的拼写错误。
自有 ID:OTP-13544 辅助 ID:PR-1007
当被分析的模块中存在无效的函数调用(例如
42(7)
)时,Dialyzer 不再崩溃。现在,编译器会对无效的函数调用(例如X = 42, x(7)
)发出警告。自有 ID:OTP-13552 辅助 ID:ERL-138
修复了导致 Dialyzer 进入无限循环的错误。
自有 ID:OTP-13653 辅助 ID:ERL-157
修复了 Dialyzer 中与调用点分析相关的错误。
自有 ID:OTP-13655 辅助 ID:PR-1092
改进和新特性
优化了
dialyzer_typesig
中 SCC 的评估。使用 Maps 而不是 Dicts 来进一步优化评估。
自有 ID:OTP-10349
自 Erlang/OTP R14A 添加了对参数化模块的支持以来,
module/0
包含了tuple/0
,但该部分已被删除;类型module/0
现在与atom/0
相同,如参考手册中所述。自有 ID:OTP-13244
改进了 Maps 的类型规范语法
- 关联类型
KeyType := ValueType
表示必须存在的关联。 - 简写
...
代表关联类型any() => any()
。
一个不兼容的更改是
#{}
表示空 map。类型map/0
(任意大小的 map)可以写成#{...}
。* 可能不兼容 *
自有 ID:OTP-13542 辅助 ID:PR-1014
- 关联类型
改进了形式到类型的转换。
自有 ID:OTP-13547
Dialyzer 2.9
修复的 Bug 和故障
Dialyzer 不再断言要从 PLT 中删除的文件和目录存在。
自有 ID:OTP-13103 辅助 ID:ERL-40
修复了关于参数化不透明类型的错误。
自有 ID:OTP-13237
修复了 Core Maps 的漂亮打印
当漂亮打印结果时,字面量 map 可能会导致 Dialyzer 崩溃。
自有 ID:OTP-13238
如果行为模块包含一个与该行为的回调函数之一同名的非导出函数,则回调信息会从 PLT 中被意外删除,因为
dialyzer_plt:delete_list/2
函数正在清理回调表。自有 ID:OTP-13287
更正了
erlang:byte_size/1
的契约更正了 map 和位串操作数的比较运算符的处理。
自有 ID:OTP-13312
改进和新特性
Dialyzer 可以识别对
M:F/A
的调用,其中M
、F
和A
均为字面量。自有 ID:OTP-13217
Dialyzer 2.8.2
修复的 Bug 和故障
在 erl_bif_types 中重新引入
erlang:make_fun/3
BIF。自有 ID:OTP-13068
Dialyzer 2.8.1
修复的 Bug 和故障
改进了形式到类型的转换。
自有 ID:OTP-12865
修复了关于参数化不透明类型的错误。
自有 ID:OTP-12866
修复了关于参数化不透明类型的错误。
自有 ID:OTP-12940
修复了有关
erlang:abs/1
的错误。自有 ID:OTP-12948
修复了关于带有联合和不透明类型的
lists:keydelete/3
的错误。自有 ID:OTP-12949
使用新函数
hipe:erts_checksum
来获取缓存的 beam 文件的正确运行时校验和。自有 ID:OTP-12964 辅助 ID:OTP-12963,OTP-12962
Dialyzer 2.8
修复的 Bug 和故障
Erlang 形式到 Dialyzer 使用的类型表示的转换在多个方面得到了改进。最重要的变化是,可以处理深层嵌套的记录。
自有 ID:OTP-12350
修复了可能导致不透明类型的虚假警告的错误。
在 Erlang/OTP 18 中,除非它们具有相同数量的参数,否则在同一个模块中声明的两个参数化类型在模块外部组合时总是会导致矛盾 (
none/0
)。这种行为与 Erlang/OTP 17 不同,例如,
dict:dict()
和dict:dict(_, _)
(它们都是不透明的)可以在dict
模块外部组合。在 Erlang/OTP 18 中,
dict:dict()
和dict:dict(_, _)
仍然可以在dict
模块外部组合。这是通过不将dict:dict()
声明为不透明类型来实现的。自有 ID:OTP-12493
当模块更改时,正确更新 PLT。(感谢 James Fish 的错误报告,以及 Stavros Aronis 修复了这个错误。)
自有 ID:OTP-12637
如果另一个操作数可以为零,则 '*'/2 的参数不受约束。
自有 ID:OTP-12725
在
dialyzer:gui()
选项中提及选项check_plt
。(感谢 James Fish。)自有 ID:OTP-12750
修复了可能导致 Dialyzer 无限循环的错误。
自有 ID:OTP-12826
改进和新特性
可以使用
-dialyzer()
属性,通过指定函数或警告选项来禁止模块中的警告。它也可以用于在模块中请求警告。自有 ID:OTP-10280
预定义类型
array()
、dict()
、digraph()
、gb_set()
、gb_tree()
、queue()
、set()
和tid()
已被删除。自有 ID:OTP-11445 辅助 ID:OTP-10342,OTP-9352
一些用于表示某些预定义类型的类型名称现在可以用于用户定义的类型。这会影响类型
product/_
、union/_
和range/2
,以及tuple/N
(N > 0)、map/N
(N > 0)、atom/1
、integer/1
、binary/2
、record/_
和'fun'/_
。一个结果是,例如,不再可能使用record(r)
来引用记录类型;而是使用通常的记录表示法#r{}
。* 可能不兼容 *
自有 ID:OTP-11851
在实现用户定义的行为时,现在可以指定可选的回调函数。有关详细信息,请参阅 OTP 设计原则用户指南,Sys 和 Proc_Lib,用户定义的行为。
自有 ID:OTP-11861
向 Dialyzer 添加两个选项:
no_missing_calls
禁止关于调用缺失或未导出函数的警告;unknown
让关于未知函数或类型的警告影响退出状态。另请参阅 dialyzer(3)。自有 ID:OTP-12682
默认情况下,dialyzer 现在将缓存 dialyzer 模块的本机版本,以避免每次启动 dialyzer 时都必须重新编译它们。可以使用选项
--no_native_cache
禁用缓存。自有 ID:OTP-12779
Dialyzer 2.7.4
修复的 Bug 和故障
修复了关于
map/0
类型的错误。自有 ID:OTP-12472
Dialyzer 2.7.3
修复的 Bug 和故障
在编译 Erlang 源代码时,Dialyzer 现在会忽略环境变量 ERL_COMPILER_OPTIONS,并跳过 Erlang 编译器选项
warnings_as_errors
。自有 ID:OTP-12225
Dialyzer 在更新记录元素时未检查它们的类型。该错误是在 Erlang/OTP 17.1 中引入的,现已更正。(感谢 Nicolas Dudebout 指出这一点。)
自有 ID:OTP-12319
在 dialyzer 模式下合并 map 键
这修复了 commit 805f9c89fc01220bc1bb0f27e1b68fd4eca688ba 中引入的回归。当使用 dialyzer 选项 '+dialyzer' 开启编译复合 map 键时,会出现该问题。
报告人:Ivan Uemlianin
自有 ID:OTP-12347
Dialyzer 2.7.2
修复的 Bug 和故障
修复了关于
is_record/2,3
的错误,以及 Dialyzer 可能因达到系统限制而崩溃的一些情况。自有 ID:OTP-12018
当给出
-Wunderspecs
标志时,Dialyzer 有时会对参数化类型输出虚假警告。此错误已修复。自有 ID:OTP-12111
Dialyzer 现在从 beam 文件中获取编译选项,并在从抽象代码创建核心时使用它们。以前,这些选项被忽略了。
自有 ID:OTP-12150
Dialyzer 2.7.1
修复的 Bug 和故障
修复了关于不透明类型的错误。感谢 Shayan Pooya 指出该错误。
自有 ID:OTP-11869
修复了 Dialyzer 无法处理包含远程类型的字段的类型化记录的错误。感谢 Erik Søe Sørensen 报告了这个错误。
自有 ID:OTP-11918
确保仅针对记录定义的类型检查字面量记录。到目前为止,如果元组的标签或大小与记录定义匹配,则元组的元素已针对记录字段类型进行了检查,通常会产生令人惊讶的结果。
自有 ID:OTP-11935 辅助 ID:seq12590
修复了涉及 Map 类型分析的 Dialyzer 崩溃问题。
自有 ID:OTP-11947
Dialyzer 2.7
修复的 Bug 和故障
Dialyzer 将不再在模块范围内检查或修改不透明类型时发出警告。
过去,使用项的形状(元组、列表等)来确定不透明项,但现在使用合约来装饰具有不透明性的类型。
自有 ID: OTP-10397
使用
--Wunmatched_returns
时,如果列表推导式中的每个值都是原子值(例如整数或原子,而不是元组和列表),则 Dialyzer 将不再在忽略列表推导式的值时发出警告。示例:忽略 '[io:format(...) || ...]
' 不会引起警告,而忽略 '[file:close(Fd) || ...]
' 则会。自有 ID: OTP-11626
dialyzer 的手册页现在包含有关 -Wno_behaviours 的正确信息。(感谢 Steve Vinosky。)
自有 ID: OTP-11706
修复了 'on_load' 属性的处理。(感谢 Kostis Sagonas。)
自有 ID: OTP-11743
以下应用程序的应用程序升级 (appup) 文件已更正
asn1, common_test, compiler, crypto, debugger, dialyzer, edoc, eldap, erl_docgen, et, eunit, gs, hipe, inets, observer, odbc, os_mon, otp_mibs, parsetools, percept, public_key, reltool, runtime_tools, ssh, syntax_tools, test_server, tools, typer, webtool, wx, xmerl
一个新的用于测试 appup 文件的测试实用程序已添加到 test_server。现在 OTP 中的大多数应用程序都使用它。
(感谢 Tobias Schlager)
自有 ID: OTP-11744
修改了 guard 约束的泛化。
自有 ID: OTP-11798 辅助 ID: seq12547
Dialyzer 现在可以很好地处理作为“外部”参数传入的 funs。(感谢 Stavros Aronis 修复了这个错误。)
自有 ID: OTP-11826
改进和新特性
预定义类型
array/0
,dict/0
,digraph/0
,gb_set/0
,gb_tree/0
,queue/0
,set/0
和tid/0
已被弃用。它们将在 Erlang/OTP 18.0 中删除。可以使用类型
array:array/0
,dict:dict/0
,digraph:graph/0
,gb_set:set/0
,gb_tree:tree/0
,queue:queue/0
,sets:set/0
和ets:tid/0
。(注意:一直有必要使用ets:tid/0
。)在 Erlang/OTP 17.0 中,允许在本地重新定义类型
array/0
,dict/0
等等。添加了新类型
array:array/1
,dict:dict/2
,gb_sets:set/1
,gb_trees:tree/2
,queue:queue/1
和sets:set/1
。引入了一个编译器选项,
nowarn_deprecated_type
。通过包含属性-compile(nowarn_deprecated_type).
在 Erlang 源文件中,可以避免 Erlang/OTP 17.0 中有关已弃用类型的警告。
该选项也可以作为编译器标志给出
erlc +nowarn_deprecated_type file.erl
自有 ID: OTP-10342
删除了基于 gs 的应用程序和基于 gs 的后端。
observer
应用程序取代了已删除的应用程序。* 可能不兼容 *
自有 ID: OTP-10915
禁止在二进制生成器的模式中使用无大小的字段,并简化 v3_core 对位串生成器的转换。(感谢 Anthony Ramine。)
自有 ID: OTP-11186
EEP43:新数据类型 - Maps
使用 Maps,您可以例如
____ -
M0 = #{ a => 1, b => 2}, % 创建关联
____ -
M1 = M0#{ a := 10 }, % 更新值
____ -
M2 = M1#{ "hi" => "hello"}, % 添加新关联
____ -
#{ "hi" := V1, a := V2, b := V3} = M2. % 将键与值匹配
有关如何使用 Maps 的信息,请参阅参考手册中的 Map 表达式。
当前实现不包含以下功能
____ - 无可变键
____ - 无单值访问
____ - 无 map 推导式
请注意,Maps 在 OTP 17.0 中是实验性的。
自有 ID: OTP-11616
引入了参数化的不透明类型。
自有 ID: OTP-11625
一些函数规范已更正或移动,并且为了允许使用 edoc,一些 edoc 注释已更正。(感谢 Pierre Fenoll)
自有 ID: OTP-11702
Dialyzer 2.6.1
修复的错误和故障
修复了一个导致无法从 GUI 进行任何分析的错误。
自有 ID: OTP-11057 辅助 ID: seq12313
改进和新特性
在 Dialyzer 的“重叠域”警告中包含模块、函数和元数。感谢 Magnus Henoch。
自有 ID: OTP-10918
改进 Dialyzer 的扫描错误输出。感谢 Magnus Henoch。
自有 ID: OTP-10996
集成来自 Andreas Schultz 的椭圆曲线贡献
为了能够在 SSL/TLS 中支持椭圆曲线密码套件,已在 public_key 和 crypto 中添加了处理椭圆曲线基础设施的功能。
这也导致了 crypto API 的重写,以获得一致性并消除不必要的开销。所有使用 crypto 的 OTP 应用程序都已更新为使用新的 API。
影响:椭圆曲线密码术 (ECC) 提供与较小的密钥大小相当的安全性,与其他公钥算法相比。较小的密钥大小可节省功耗、内存、带宽和计算成本,这使得 ECC 对受限环境特别有吸引力。
自有 ID: OTP-11009
位串类型推断和重复模块错误消息修复。感谢 Stavros Aronis。
自有 ID: OTP-11027
包含非 ASCII 字符的 Erlang 源文件现在以 UTF-8 编码(而不是 latin1)。
自有 ID: OTP-11041 辅助 ID: OTP-10907
Dialyzer 2.6
改进和新特性
由于 Unicode 支持而进行的杂项更新。
自有 ID: OTP-10820
具有相同名称和不同元数的用户定义类型以及文档不一致。感谢 Stavros Aronis。
自有 ID: OTP-10861
本机代码编译更改。感谢 Kostis Sagonas。
自有 ID: OTP-10865
Dialyzer 2.5.4
改进和新特性
已实现对 Unicode 的支持。
自有 ID: OTP-10302
Dialyzer 不再输出未使用的匿名函数 (“funs”) 的警告。仍然会输出未使用函数的警告。
自有 ID: OTP-10433
在必要时,已在 Erlang 文件中添加了声明编码的注释。该注释旨在在 UTF-8 成为默认编码时在 Erlang/OTP R17B 中删除。
自有 ID: OTP-10630
已更正了一些超出 PDF 页面宽度的示例。
自有 ID: OTP-10665
修复了记录创建违规警告的精度。感谢 Stavros Aronis
自有 ID: OTP-10681
报告不匹配列表的规范差异。感谢 Stavros Aronis。
自有 ID: OTP-10740
正确支持类型规范中具有任意元数的函数。感谢 Stavros Aronis。
自有 ID: OTP-10772
Dialyzer 2.5.3
修复的错误和故障
修复了竞争条件检测中的崩溃
删除旧的未经测试的实验性扩展
在使用 dialyzer:run/1 时遵守 {plt_check,false} 选项
修复了出现在元组集中的元组设置远程类型的处理
自有 ID: OTP-10464
Dialyzer 2.5.2
修复的错误和故障
正确处理合约中的类型名称。修复了与合约检查相关的崩溃。不要重写未更改的 PLT。
自有 ID: OTP-10083
停止一个被遗忘的服务器进程
Dialyzer 在完成分析之前忘记停止服务器进程。这是 Concuerror 检测到的并发错误。更改以修复运行 dialyzer -Wunmatched_returns 识别的警告。感谢 Kostis Sagonas。
自有 ID: OTP-10231
改进和新特性
对
dialyzer_typesig
的错误修复和改进。自有 ID: OTP-10082
添加并行 dialyzer 支持
自有 ID: OTP-10103
引入了
dialyzer_typesig
中求解器的替代实现。它比原始实现更快。自有 ID: OTP-10110
修复了
erl_types:t_inf()
(HiPE) 和dialyzer_dataflow
(Dialyzer) 中的错误。自有 ID: OTP-10191
Dialyzer 2.5.1
改进和新特性
以与编译器相同的方式处理
nowarn_unused_function
。自有 ID: OTP-9833
Dialyzer 2.5
修复的错误和故障
修复有关闭包应用的错误警告
每当在特定应用程序中使用可以保存两个或多个可能的闭包之一的变量时,如果其中一个闭包在此应用程序中失败,则假定该应用程序失败。已将其更正为:如果所有可能的闭包在特定应用程序中都会失败,则推断出失败的应用程序。
更改“可能也返回”警告的类别
Dialyzer 发出类似如下的警告:“_ 的规范声明该函数可能也返回 ,但推断的返回是”,这实际上是欠规范而不是错误的类型规范。此补丁确保将它们归入适当的类别。
自有 ID:OTP-9707
为 Dialyzer 封装行为补丁
- 默认启用警告,添加两个选项用于禁止警告
- 修复警告格式并更新测试套件。
- 检测回调规范差异
- 允许 none() 作为回调中的返回值
- Dialyzer 的行为回调差异检测
- 添加回调的查找函数
- 将回调存储在代码服务器和 PLT 中
- 在编译期间收集回调定义
- 更新 inets 结果
自有 ID:OTP-9731
- 不警告具有远程类型的欠规范
- 修复 Typer 中的崩溃
- 修复 Dialyzer 对其自身代码的警告
- 修复 HiPE 中 Dialyzer 的警告
- 在特定的 Dialyzer 崩溃中添加文件/行信息
- 更新 inets 测试结果
自有 ID:OTP-9758
- 更正应用程序模块中的回调规范
- 改进关于具有额外范围的回调规范的警告
- 清理 autoimport 编译器指令
- 修复 typer 中 Dialyzer 的警告
- 修复 Dialyzer 对其自身代码的警告
- 修复 Dialyzer 的行为分析中的错误
- 修复 Dialyzer 中的崩溃
- 变量替换没有泛化任何未知变量。
自有 ID:OTP-9776
改进和新特性
优化
dialyzer_dataflow
中映射的连接。自有 ID:OTP-9761
Dialyzer 2.4.4
已修复的错误和故障
更新 race_SUITE/extract_translations 的结果 更新 small_SUITE/flatten 的结果 添加 codec_can 和 list_to_bitstring 测试 修复报告未使用函数时的错误 更新 Dialyzer r9c_suite 结果 修复二元理解的默认子句上的 dialyzer 警告(感谢 Ivan Dubrov)
自有 ID:OTP-9483
修复服务器循环检测
Dialyzer 通常不会为实现非终止服务器循环的函数发出警告。当 SCC 中的某些元素正常终止时(例如,列表理解或包含在 SCC 中的其他通用匿名函数),此检测失败。此补丁修复了该问题。
自有 ID:OTP-9489
添加 proplist() 类型
最近,我在为 API 添加规范时发现没有定义规范的 proplist() 类型。(感谢 Ryan Zezeski)
自有 ID:OTP-9499
禁止一些关于生成不返回 fun 的警告
当生成它们的函数具有指定它将返回这种不返回 fun 的契约时,不会对不返回的 fun 发出警告。
增强 Dialyzer 对比较的推断
此补丁使 Dialyzer 了解 Erlang 的术语全序,从而能够在例如 integer() < tuple() 被视为也可能返回 false 的比较(而它肯定总是返回 true)的情况下进行差异检测。
死代码中的小修复
修复数据流中的无限循环
更新 dialyzer 测试套件中的 r9c/{inets,mnesia} 结果
将来源信息添加到 #fun_var 闭包
(感谢 Tuncer Ayaz 和 Maria Christakis)
自有 ID:OTP-9529
必要时在类型中引用原子
当格式化为字符串时,某些出现的原子没有被正确引用,例如通过 typer 程序(感谢 Tomas Abrahamsson)
更新 Dialyzer 的参考结果
自有 ID:OTP-9560
修复 typer 对不存在文件的崩溃 删除未使用的宏 修复数据流中的错误 减少元组元数限制 这修复了一个与内存相关的崩溃。
自有 ID:OTP-9597
改进和新特性
已扩展/更正了几个 BIF 的类型。此外,
lists:keyfind/3
、lists:keysearch/3
和lists:keyemember/3
的类型也已更正。不正确/不完整的类型可能会导致错误的 dialyzer 警告。自有 ID:OTP-9496
Dialyzer 2.4.3
已修复的错误和故障
修复错误函数的名称(感谢 Maria christakis)
自有 ID:OTP-9175
修复与契约归咎分配补丁相关的崩溃
自有 ID:OTP-9219
dialyzer/doc:同步 manual.txt 和 dialyzer.xml(感谢 Tuncer Ayaz)
自有 ID:OTP-9226
简化 Dialyzer 的测试套件结构
*_SUITE.erl 文件现在由 Makefile 通过各自的数据目录自动生成。
自有 ID:OTP-9278
Dialyzer 2.4.2
已修复的错误和故障
向 Dialyzer 添加 --fullpath 选项
此更改向 Dialyzer 添加了一个 --fullpath 选项,该选项使警告消息包含相应文件的完整路径。
原始补丁由 Magnus Henoch (legoscia) 于 2010 年 9 月 15 日提交,并且在这段时间里在 'pu' 分支中被反复修改。
该补丁本质上是正确的,并且大部分都按原样使用,但是进行了一些更改以使代码稍微美观一些,避免一些代码重复,并向 dialyzer 的文档文件及其帮助消息添加了文档。
自有 ID:OTP-9098
修复关于包含 not 的保护的警告
关于使用 'not' 的不可满足保护的警告措辞不正确(没有提到 'not',它显示为“保护测试 is_atom(atom()) 永远不会成功”)(感谢 Stavros Aronis)。
自有 ID:OTP-9099
版本 2.4.2 (在 Erlang/OTP R14B02 中) ------------------------------------ - 添加了 --fullpath 选项以显示带有完整文件名的警告文件(感谢 Magnus Henoch 的原始补丁)。 - 更好地处理生成警告的 'and'/'or'/'not' 保护(感谢 Stavros Aronis)。 - 当函数的规范有错误时,更好地进行归咎分配(感谢 Stavros Aronis)。 - 当元组/记录模式包含违反记录字段声明类型的子项时,提供更具描述性的警告(感谢 Matthias Lang 的测试用例和 Stavros Aronis 的实际修复)。
自有 ID:OTP-9126
为 dialyzer_cl_parse:get_lib_dir/1 添加规范
自有 ID:OTP-9129
改进和新特性
Dialyzer 的测试套件
这是将 cvs.srv.it.uu.se:/hipe 存储库 dialyzer_tests 的大部分内容转录为使用测试服务器框架的测试套件。
有关如何使用包含的脚本进行修改和更新的信息,请参阅 README。
测试 Dialyzer 时,重要的是在 plt 中包含多个 OTP 模块。这些套件也负责处理这个问题。
自有 ID:OTP-9116
Dialyzer 2.4.0
已修复的错误和故障
- 修复了当细化其函数都返回 none() 的 SCC 的类型时出现的非常罕见的无限循环(感谢 Stavros Aronis)。
- 修复了获取两个 tuple_set 的下确界时出现的非常罕见的崩溃。
自有 ID:OTP-8979
改进和新特性
- 添加了为分析提供多个 PLT 的能力(选项 --plts)。目前,这些 PLT 必须是独立的(即,没有模块出现在多个 PLT 中),并且不得包含模块名称冲突的文件。
- 加强并简化了某些 BIF 和关键库函数的硬编码类型信息。
自有 ID:OTP-8962
Dialyzer 2.3.1
改进和新特性
消除了自动导入的 BIF 冲突的警告。
自有 ID:OTP-8840
Dialyzer 2.3.0
改进和新特性
对 R14 的 dialyzer 相关文件进行了各种更改。
- Dialyzer 正确支持新的属性 -export_type,并检查远程类型是否仅引用导出的类型。如果某些文件/应用程序引用了既不在 PLT 中也不在分析的应用程序中定义的模块中的类型,则会发出警告。
- 支持检测涉及 whereis/1 和 unregister/1 的数据竞争。
- 更精确地识别记录结构违反其字段声明类型的原因。
- 修复了处理 'or' 保护中的错误。
- 更好地处理 erlang:element/2 BIF。
- 完整处理 Erlang BIF。
自有 ID:OTP-8699
Dialyzer 2.2.0
改进和新特性
更好地支持不透明类型(感谢 Manouk Manoukian)。
添加了对递归类型的支持(实验性)。
添加了对参数化模块的支持。
Dialyzer 现在会在 -specs 声明函数返回某种类型但实际上没有返回时发出警告。
添加了
--no_native
(-nn
) 选项,以便用户可以绕过 dialyzer 在 dialyzing 许多文件时启发式执行的本机代码编译。修复了 dialyzer 脚本中的小错误,允许 --wx 选项在选项列表中的位置无关紧要的情况下启动基于 wx 的 GUI。
在上一版本中添加的选项 --apps 和 -Wrace_conditions 现在已在手册中正确记录。
自有 ID:OTP-8464
Dialyzer 2.1.0
改进和新特性
现在使用大多数平台上都存在的开源工具(xsltproc 和 fop)构建文档。一个明显的变化是删除了框架。
自有 ID:OTP-8201
Dialyzer 可以静态检测 Erlang 程序中的某些类型的数据竞争。使用新的选项 -Wrace_conditions 来启用竞争分析。该技术在一篇论文中进行了描述,该论文可在以下网址获得:http://www.it.uu.se/research/group/hipe/dialyzer/publications/races.pdf
添加了对包的支持(感谢 Maria Christakis)。
Dialyzer 的默认模式发生了重大变化。以前,默认模式是 GUI,而现在是命令行。由于此更改,现在可以使用以下命令分析一组文件/目录
- dialyzer file1 ... fileN
换句话说,-c (--command-line) 选项不再是必要的,尽管为了向后兼容,它将在一段时间内保留。要启动 dialyzer 的 GUI,请使用以下任一命令:
- dialyzer --gui %% 用于旧的基于 gs 的 GUI
- dialyzer --wx %% 用于新的基于 wx 的 GUI(如果可用)
有一个新的选项 --apps,它允许用户轻松引用 Erlang/OTP 应用程序,并将它们包含在分析或 PLT 构建中。例如,我们建议使用以下命令构建 PLT:
- dialyzer --build_plt --apps erts kernel stdlib mnesia ...
新选项还可以接受绝对文件名以及应用程序。请注意,包含在 PLT 中的应用程序版本是与所使用的 Erlang/OTP 系统对应的版本。
Dialyzer 有一个新的基于 wxWidgets 的 GUI(感谢 Elli Frangaki),适用于 wx 应用程序可用的平台。
Own Id: OTP-8300
Dialyzer 2.0.0
改进和新功能
dialyzer 的功能有一个重大新增,值得升级版本号。从这个版本开始,dialyzer 不仅接受而且正确处理远程类型(即,ModuleName:TypeName() 形式的类型)。之前的 dialyzer 版本仅在 -type 和 -spec 声明中接受此表示法,但通过将远程类型映射到类型 any() 来有效地忽略其信息。相反,从这个版本开始,远程类型将用于分析,并且还会存储在 PLT 中。(此新增功能更改了 PLT 的格式,并需要重建任何由旧 dialyzer 版本创建的 PLT。)请注意,如果 dialyzer 需要处理没有定义的远程类型(要么是因为模块不包含类型的定义,要么是因为该模块未包含在分析中),dialyzer 将会报错并中止对一组模块的分析。我们可能会在未来的版本中放宽此限制。
修复了 dialyzer:run/1 在用于向现有 PLT 添加类型信息时(在其返回时)崩溃的次要问题。
修复了 dialyzer GUI 中的一些次要但非常烦人的问题。
Own Id: OTP-8187
Dialyzer 1.9.2
改进和新功能
修复了当分析一个不返回但包含错误调用导致失败并被分配类型 none() 而不是类型 unit() 的强连通函数组件时,类型推断进入无限循环的问题。
针对一些 BIF 和库文件,提供了更准确的类型信息。
引入了 boolean() 作为迄今为止被称为 bool() 的类型的“官方”名称。后者仍然可以接受,就像 boolean() 一样。
Own Id: OTP-8037
Dialyzer 1.9.1
改进和新功能
更好地处理了不透明类型。
对位流的 UTF 段的处理已得到显著加强和修订。现在很有可能是正确的。
Own Id: OTP-7958
Dialyzer 1.9.0
改进和新功能
该分析接受不透明类型声明,并检测此类类型的项的不透明性违规。从 R13 开始,许多 Erlang/OTP 标准库(array、dict、digraph、ets、gb_sets、gb_trees、queue 和 sets)都包含其主要数据类型的不透明类型声明。Dialyzer 将在显式依赖这些项结构的代码中发出警告。
添加了对处理位流中的 UTF 段以及检测这些段中明显的类型错误的支持。警告:此代码没有经过大量测试,因为很少有 Erlang 程序使用基于 Unicode 的二进制文件 - 这并不奇怪,因为这是 R13 的一项新语言功能。
加强了在测试不同类型的项之间的相等性和匹配时对差异的识别。这会检测出代码中的更多错误。
对于 M:F(...) 调用,其中 M 不是模块项,F 不是原子,添加了警告。以前,发现此类调用会失败,但未报告失败的原因。
为 --no_check_plt 选项 (-n) 添加了便捷的简写形式。
添加了 --dump_callgraph 选项,用于将所有分析文件的调用图转储到指定的文件中。调用图可以转储为原始格式、.dot 格式,或转换为 .ps (postscript) 文件。请注意,在大型调用图中,生成的 postscript 文件可能无法被 Ghostview 解释。(感谢 Ilya Khlopotov 提供此功能的初始版本。)
Own Id: OTP-7864
Dialyzer 1.8.3
改进和新功能
添加了
--no_check_plt
选项,以便在使用不更改的稳定 PLT 时加快启动时间。更改了一些警告的措辞,使其不会对某些用户造成困惑,并且更符合实际情况。
Own Id: OTP-7632
Dialyzer 1.8.2
改进和新功能
次要更新。
Own Id: OTP-7522
Dialyzer 1.8.1
改进和新功能
Dialyzer 有一个新的
--raw
选项,用于以 Erlang 术语输出分析结果,以便于后续的筛选和/或格式化。Own Id: OTP-7386
Erlang 接口 dialyzer:run/1 的返回类型已更改为仅返回警告列表。如果出现问题,dialyzer 会因异常而终止。
现在,PLT 的处理更加灵活。OTP 不再包含任何默认 PLT。请参阅手册了解更改。
Own Id: OTP-7389
Dialyzer 1.8.0
改进和新功能
从现在起,Dialyzer 的分析完全基于成功类型。特别是,对选项
--old_style
和--dataflow
的支持已停止。更好地、更积极地处理记录中的类型信息。
Dialyzer 有一个新的警告选项
-Wunmatched_returns
,用于警告忽略返回值的函数调用。这可以捕获许多常见的编程错误(例如,调用file:close/1
并且不检查是否没有错误)、接口差异(例如,一个函数返回多个值,而实际上该函数是 void 并且仅因其副作用而被调用)、调用错误的函数(例如,io_lib:format/1
而不是io:format/1
),甚至可能存在性能缺陷(例如,不必要地使用列表推导式而不是使用lists:foreach/2
来构造列表)。当函数返回单个原子值(例如 'ok' 或 pid())时,警告将被抑制。这允许“void”函数(返回像 'ok' 这样的单个原子)或对某些内置函数(如spawn
)的调用。由于并非所有忽略返回值的调用都是差异,因此默认情况下该选项处于关闭状态,必须由用户显式请求。但我们仍然推荐它。删除了一些警告选项(
-Wno_comp
、-Wno_guards
、-Wno_unsafe_beam
等),这些选项可以在分析旧 BEAM 编译器生成的字节码时使用。Own Id: OTP-7241
Dialyzer 1.7.2
改进和新功能
Erlang 接口返回的警告现在包含描述警告类型的标签。
* 可能不兼容 *
Own Id: OTP-7134
Dialyzer 1.7.1
改进和新功能
现在,默认使用成功类型,它更强大,并且比以前的版本检测到更多错误。
Dialyzer 现在接受并考虑记录声明和合同中的类型信息——请参阅 Erlang'07 研讨会上的相关论文。各种 OTP 应用程序(例如,stdlib 和 kernel)都使用适当的合同部分进行了注释,这些合同为它们的函数指定了类型信息。
先前被称为 unit() 的类型已重命名为 no_return()。现在,在合同中将其用作函数的返回类型可以消除“函数没有局部返回”的 dialyzer 警告,而无需使用相应的选项。
Own Id: OTP-6997
Dialyzer 1.7.0
改进和新功能
次要 Makefile 更改。
Own Id: OTP-6689
Dialyzer 现在可以使用成功类型来查找差异。因此,检测到的差异显着增加。缺点是分析时间比以前的版本长约 2 到 2.5 倍,并且可能还会导致一些警告更难以解释,即使它们是正确的。这是一个重大变化,值得增加版本号。
新的命令行选项
--succ_typings 使用成功类型分析。
--dataflow(默认)使用之前的分析。
引入了新的类型 unit() 来处理非终止函数(例如服务器)的返回类型。
Dialyzer 的代码服务器使用压缩表示,并且分析所需的内存比以前的版本少得多。
Own Id: OTP-6736
Dialyzer 1.6.0
改进和新功能
Dialyzer(在分析包含 debug_info 的源代码或 BEAM 代码的模式下)会为所有差异输出行信息。这是一个重大变化,值得增加版本号。
我们警告用户,与之前的版本和应用程序相比,此版本的 Dialyzer 识别出明显更多的差异。如果出于某种原因,您更喜欢 Dialyzer 之前版本生成的警告,可以使用命令行选项 --old_style。
Own Id: OTP-6546
Dialyzer 可以更精确地处理项比较运算符,并且能够识别在具有比较的“if”或“case”语句中更多的差异。
Dialyzer 具有许多标准 OTP 函数的更精确的类型信息。
Own Id: OTP-6547
Dialyzer 1.5.1
改进和新特性
更新了 Dialyzer 用户指南中“关于持久查找表(PLT)的更多信息”章节,并添加了如何从 Erlang 中使用 Dialyzer 的信息,请参考
dialyzer
。此外,其 GUI 使用的 Dialyzer 文本文件现在也包含在 Erlang/OTP 发布版本中。自有 ID:OTP-6361
新增选项
--check_init_plt
和--verbose
。分析方面的改进(意味着此版本可以发现比以前版本更多的差异)。
自有 ID:OTP-6421
Dialyzer 1.5.0
改进和新特性
Dialyzer 的 PLT 构建基于不同的类型推断算法。更具体地说,Dialyzer 使用精炼成功类型的推断来推断函数原型。因此,Dialyzer 将其分析建立在更强大的基础上,从而能够检测到更多差异。缺点是构建 PLT 的过程明显变慢。我们将致力于改进这一点。
Dialyzer 会考虑 BEAM 编译器指令
-compile({nowarn_unused_function, {F,A}}).
,然后抑制函数 F/A 永远不会被调用的警告。Dialyzer 的默认初始 PLT 现在还包括 “mnesia”。
自有 ID:OTP-6304
Dialyzer 1.4.2
改进和新特性
PLT 管理方面的改进。
自有 ID:OTP-6128
Dialyzer 1.4.1
修复的 Bug 和故障
- 一些小的改动。
改进和新特性
- 一些小的改动。
Dialyzer 1.4.0
修复的 Bug 和故障
- 为使 Dialyzer 能够在 Erlang/OTP R10B-10 上工作而进行的更改。
改进和新特性
- Dialyzer 的分析速度显著加快,因为它使用全局函数调用图来获取所有分析函数的类型签名。
Dialyzer 1.3.1
修复的 Bug 和故障
- 为使 Dialyzer 能够在 Erlang/OTP R10B-5 上工作而进行的小改动。
- 修复了分析中的一个小 bug;这影响了 HiPE 的一个文件。
改进和新特性
- 修改了在 Cygwin 下执行的设置脚本(Vlad Dumitrescu 的补丁)。
- 添加了命令行选项 --no_warn_on_inline。
- 当分析来自不同目录但名称相同的模块时,Dialyzer 现在会明确发出警告(由 Ulf Wiger 贡献)。
Dialyzer 1.3.0
修复的 Bug 和故障
- 修复了 Dialyzer 1.2.0 吐出的许多误报。
改进和新特性
- 需要存在 Erlang/OTP R10B-4 系统。
- Dialyzer 的速度显著提高(大约 40%),因为它现在使用 'ets' 而不是 'dets' 来处理 PLT。
- 稍微提高了分析的精度。
- 在 GUI 版本中,Dialyzer 现在会报告一个模块列表,这些模块应包含在要分析的模块中,以便可能提高报告结果的准确性。
- 当使用错误类型的参数调用函数或闭包时,会显示更多信息。
- 记录保护现在允许将已知是记录的元组的差异显示为 #rec{} 而不是 {'rec',,...,}
- 添加了 -q 选项,使 Dialyzer 的命令行版本更加安静。
Dialyzer 1.2.0
改进和新特性
- Dialyzer 可在所有平台上与 Erlang/OTP R10B-2 的开源和商业版本一起使用(即,不再需要 HiPE 支持)。
- 每当 .beam 文件包含抽象代码时(即,已使用 +debug_info 选项编译),分析都会从该代码而不是 BEAM 字节码开始 - 这使得结果与从源代码开始分析获得的结果相同。(这是 Bjorn Gustavsson 的贡献 - 谢谢!)
- 添加了 -pa 命令行选项,以便更容易处理源代码中的 -include_lib() 指令。
- 包括 v1.1.1 中添加的所有更改;请参见下文。“递归添加”功能在命令行模式(-r 选项)中也可用。
Dialyzer 1.1.1
修复的 Bug 和故障
- 修复了在 Solaris 机器上使用 shell 脚本的问题。
- 修复了 Dialyzer 文档和帮助中的一些小的不一致之处。
改进和新特性
- Dialyzer 的命令行模式默认在 stdout 中输出差异,并返回一个数字值来指示其退出状态。
- 添加了由 Martin Bjorklund 贡献的“递归添加”按钮(谢谢!)。
Dialyzer 1.1.0
改进和新特性
- Dialyzer 可在 Erlang/OTP R10B-1 的开源版本中使用(在 HiPE 支持可用的平台上),并且不再需要安装自定义的 Erlang/OTP 系统。
- 除了增强的 GUI 之外,Dialyzer 还带有一个广泛的命令行界面。
- 分析可以从源代码(通过 Core Erlang)以及 BEAM 字节码开始。
- 与以前的版本相比,Dialyzer 在 Erlang 代码中发现了更多差异。
- 添加了选择性地打开/关闭不同警告类别的功能。
Dialyzer 1.0.1
修复的 Bug 和故障
- 修复了 v1.0.0 的一个主要 bug,该 bug 导致在分析多个模块时分析过早停止(即,未正确达到不动点)。这不会影响结果的正确性,但失去了许多检测差异的机会。
改进和新特性
- 分析性能方面的改进。
Dialyzer 1.0.0
改进和新特性
- 初始 Dialyzer 版本:分析仅从 BEAM 字节码开始,并且仅提供 GUI 版本。Dialyzer 报告 Erlang “顺序”部分使用中的差异。要使用,Dialyzer 需要存在 Erlang/OTP 的特定快照,该快照可以从 Dialyzer 的主页获取。