【问题标题】:Dialyzer error on deleting a field from record从记录中删除字段时透析器错误
【发布时间】:2015-03-03 13:18:46
【问题描述】:

我正在尝试执行 mnesia 表转换以进行架构升级。在我的新模式中,我从之前的记录定义中删除了一个字段。架构的其余部分保持不变。这是一些代码-

XformFun = fun(OldRecord) ->
    NewRecord = #bdm_employee{id=element(2, OldRecord), name=element(3, OldRecord),
                                address=element(4, OldRecord),
                                job_type=element(6, OldRecord),
                                ...
                                description=element(34, OldRecord)},
    NewRecord
end,
mnesia:transform_table(bdm_employee, XformFun, record_info(fields, bdm_employee))

我的原始记录有 34 个字段。删除第 5 个字段后,dialyzer 抱怨尝试访问元素 #34 的记录范围之外的索引。但是,我觉得这很奇怪,因为“mnesia:transform_table”可以在任何记录上执行,其大小可以是 34、33 或其他任何内容。为什么透析器会抱怨?感谢一些解决此问题的指导...

透析器错误-

dialyzer: Analysis failed with error:
{function_clause,[{lists,nth,2,[]},
                  {dialyzer_typesig,find_element,2,[]},
                  {dialyzer_typesig,get_bif_constr,4,[]},
                  {dialyzer_typesig,handle_call,3,[]},
                  {dialyzer_typesig,traverse,3,[]},
                  {dialyzer_typesig,handle_clauses_1,7,...},
                  {dialyzer_typesig,handle_clauses,...},
                  {dialyzer_typesig,...}]}

【问题讨论】:

  • 您的转换是否有-spec?我猜透析器对 OldRecord 的类型感到困惑。
  • 我没有关于转换的规范,但我在转换开始时发现了一些将 OldRecord 视为记录类型 bdm_employee 的语句。当您尝试访问额外的元素时,这会使透析器关闭。

标签: erlang mnesia dialyzer


【解决方案1】:

(从 cmets 复制)

Dialyzer 的错误是当记录中没有 34 个元素时,它试图获取第 34 个元素的类型。这反过来又是因为 Dialyzer 得到了错误的 OldRecord 类型。

准确找到类型被推断为您没想到的东西的位置可能会很棘手。最简单(尽管仍然不容易)的解决方案是在更多地方注释类型。例如,如果您将 fun (OldRecord) 分解为 -spec,Dialyzer 会为您提供更有帮助的错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    相关资源
    最近更新 更多