问题标签 [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 回答
335 浏览

erlang - 导出函数时透析器未检测到保护违规

透析器 2.9 版。厄特 7.3。一次性密码 18。

在以下人为设计的 erlang 代码中:

当透析器在上面的代码上运行时,它会警告代码将无法工作,因为保护测试 (X > 5) 永远不会成功。

但是,当我取消注释第 3 行并导出 f1/1 函数时,透析器不再发出任何警告。

我意识到当 f1/1 被导出时,透析器不可能知道保护子句将失败,因为外部客户端可以使用它。但是,为什么它不能再确定 test/0 错误地使用了 f1/1 呢?

0 投票
1 回答
462 浏览

erlang - Elixir / Erlang Dialyzer:为什么行为回调的参数类型应该是子类型而不是超类型?

我有一个行为 X 和一个带有参数类型的回调函数:

模块 Y 实现行为 X 并且实现模块 Y 中的回调函数具有参数类型:

Dialyzer 不喜欢这样并抱怨:

这意味着透析器尝试确定实现模块 Y 中的回调参数类型是否是行为 X 中的参数类型的超类型。换句话说,它要求:

行为 X 的回调参数类型%{a: any}是实现模块 Y 的参数类型的子类型%{a: any, b: any}吗?

为什么透析器期望行为回调的参数类型是子类型而不是超类型?

在编程语言类型论的上下文中,子类型定义为:

类型 S 是类型 T 的子类型,写作 S <: T,如果类型 S 的表达式可以在任何需要类型 T 的元素的上下文中使用。另一种说法是任何类型 S 的表达式都可以伪装作为类型 T 的表达式。

T根据上面的定义,如果行为回调的参数类型是,实现模块的参数类型是,对我来说是有意义的S。因为实现模块仍然保持行为契约。但是,我不知道为什么透析器期望相反。

请帮助我理解这一点。

注意:这个问题是后续问题,但独立于另一个 SO 问题Erlang (Elixir) Dialyzer - 令人困惑的超类型错误

0 投票
1 回答
1498 浏览

erlang - 在 Elixir 类型规范的类型定义中指定一个字符串值

是否可以按如下方式定义类型:

更好地分析代码,例如:

我知道我可以将这种类型定义为@type t :: String.t,但是,Dialyzer 不会抱怨使用与可能不同的值(从应用程序的角度来看可能)。

我在Typespecs的文档中没有看到关于这个用例的任何提示,但也许我遗漏了一些东西。

0 投票
1 回答
661 浏览

elixir - 自定义异常和类型规范

在 elixir 中,您可以像这样定义自定义异常:

但这Elixir.Exception不再是

因此,如果您将它与定义了这种类型规范的第三方库一起使用:

dialyzer崩溃,breaks the contract因为 CustomError 不是异常:

调用 'Elixir.Sentry':capture_exception('Elixir.AppWeb.CustomError',[{'stacktrace',[{atom(),atom(),[any()] | byte(),[{'file', string()} | {'line',pos_integer()}]}]},...]) 违反合约('Elixir.Exception':t(),'Elixir.Keyword':t()) ->任务()

你能以某种方式扩展Elixir.Exception模块AppWeb.CustomError吗?或者如何遵循最佳实践来解决这个问题?

0 投票
1 回答
303 浏览

elixir - 类型化列表 typespec 从不违反合同

如果您定义一个 typespec 并使用不同类型的参数,它将显示类似于以下内容的错误:

例如这个类型规范:

但它似乎不适用于类型化列表,或者至少,它永远不会显示警告,如果我有一个接收字符串列表的方法,我会定义这个类型规范:

然后我可以为列表定义任何规范,并且在运行透析器时它永远不会抱怨,即:

这是故意的吗?看起来如果我定义了一个任何类型的列表[any()]

还有其他方法可以实现这一目标吗?

0 投票
1 回答
490 浏览

erlang - 如何为单个字母 ASCII 字符串(值 0-127)键入规范?

等效地,如何为“单个”UTF8 字符指定类型?

在类型定义中,我可以使用通用的“任何字符串”或“任何 utf8 字符串”

但似乎我无法匹配第一位为 0

单个 UTF 位序列的情况是

(例如,这些位模式在使用模式匹配时匹配

成功。)

但是当在 typespecs 中使用时,编译器会抱怨很多

有没有办法对这样的位模式进行类型规范?

0 投票
1 回答
223 浏览

erlang - erlang覆盖规范或忽略rebar3的中断合同错误

我在一个具有一些 3rd 方依赖项的项目上运行 rebar3,其中一个在定义的规范方面存在问题。当我转到 rebar3 时,弹出一个新错误,表明我的一个方法调用违反了合同:

实际上,此代码与 atom 或 pid 完美配合。除了更新第三方库之外,有没有办法在不分叉代码的情况下覆盖该规范,或者只是忽略该特定错误?

0 投票
2 回答
198 浏览

erlang - Dialyzer 遗漏类型规范的错误

下面的 Erlang 代码在它的类型规范中似乎有一个明显的错误,但是 dialyzer 说一切正常。是我误解还是这是透析器中的错误?在 Erlang 19.3 上运行

0 投票
1 回答
83 浏览

elixir - Dialyxir 错误 order_by 不返回 Ecto.Query.t

我有这个方法

然后我用一个查询链接该方法:

该代码工作正常,但显然 fordialyzer order_by没有返回 aEcto.Query.t因为它抱怨:

调用 'modify_query'... 没有 atom() 类型的术语 | 'Elixir.Ecto.Query':t()(带有不透明子项)作为第一个参数

如果我注释掉# |> order_by([desc: :start])dialyzer不会抱怨

我已经通过 iex 测试了以下输出:

它说它的数据类型是 Ecto.Query:

那么透析器怎么会抱怨呢?

0 投票
1 回答
580 浏览

elixir - Arc.Ecto.changeset 的类型规范

我正在复制 Arc.Ectochangeset示例https://github.com/stavro/arc_ecto 并且我不确定类型规范,我正在尝试使用这些但似乎不适用于透析器,它抱怨|> cast_attachments(params, [:avatar])

cast_attachments 是一个宏,所以我不确定如何为宏定义类型规范,因为在它的源代码中没有定义任何规范https://github.com/stavro/arc_ecto/blob/master/lib/arc_ecto/schema.ex