问题标签 [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.
erlang - 导出函数时透析器未检测到保护违规
透析器 2.9 版。厄特 7.3。一次性密码 18。
在以下人为设计的 erlang 代码中:
当透析器在上面的代码上运行时,它会警告代码将无法工作,因为保护测试 (X > 5) 永远不会成功。
但是,当我取消注释第 3 行并导出 f1/1 函数时,透析器不再发出任何警告。
我意识到当 f1/1 被导出时,透析器不可能知道保护子句将失败,因为外部客户端可以使用它。但是,为什么它不能再确定 test/0 错误地使用了 f1/1 呢?
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 - 令人困惑的超类型错误。
erlang - 在 Elixir 类型规范的类型定义中指定一个字符串值
是否可以按如下方式定义类型:
更好地分析代码,例如:
我知道我可以将这种类型定义为@type t :: String.t
,但是,Dialyzer 不会抱怨使用与可能不同的值(从应用程序的角度来看可能)。
我在Typespecs的文档中没有看到关于这个用例的任何提示,但也许我遗漏了一些东西。
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
吗?或者如何遵循最佳实践来解决这个问题?
elixir - 类型化列表 typespec 从不违反合同
如果您定义一个 typespec 并使用不同类型的参数,它将显示类似于以下内容的错误:
例如这个类型规范:
但它似乎不适用于类型化列表,或者至少,它永远不会显示警告,如果我有一个接收字符串列表的方法,我会定义这个类型规范:
然后我可以为列表定义任何规范,并且在运行透析器时它永远不会抱怨,即:
这是故意的吗?看起来如果我定义了一个任何类型的列表[any()]
还有其他方法可以实现这一目标吗?
erlang - 如何为单个字母 ASCII 字符串(值 0-127)键入规范?
等效地,如何为“单个”UTF8 字符指定类型?
在类型定义中,我可以使用通用的“任何字符串”或“任何 utf8 字符串”
但似乎我无法匹配第一位为 0
单个 UTF 位序列的情况是
(例如,这些位模式在使用模式匹配时匹配
成功。)
但是当在 typespecs 中使用时,编译器会抱怨很多
有没有办法对这样的位模式进行类型规范?
erlang - erlang覆盖规范或忽略rebar3的中断合同错误
我在一个具有一些 3rd 方依赖项的项目上运行 rebar3,其中一个在定义的规范方面存在问题。当我转到 rebar3 时,弹出一个新错误,表明我的一个方法调用违反了合同:
实际上,此代码与 atom 或 pid 完美配合。除了更新第三方库之外,有没有办法在不分叉代码的情况下覆盖该规范,或者只是忽略该特定错误?
erlang - Dialyzer 遗漏类型规范的错误
下面的 Erlang 代码在它的类型规范中似乎有一个明显的错误,但是 dialyzer 说一切正常。是我误解还是这是透析器中的错误?在 Erlang 19.3 上运行
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:
那么透析器怎么会抱怨呢?
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