問題タブ [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 - typer による注釈後のダイアライザーの実行で警告が表示されなかった
約 6000 行の Erlang コードがあるプロジェクトで、型-spec()
注釈がまだない場合、次のことを試しました。
*.erl
すべてのファイルを注釈付きのファイルに置き換えて実行しました
多くの警告が表示されることを期待していましたが (初回はダイアライザーとタイパーの組み合わせを実行しました)、ダイアライザーがレポートしたのは、user_default 内の存在しない関数に対する 2 つの古い呼び出しでした。
デフォルトの警告は他にトリガーされませんでした。
使い方を間違えたのか、それともこのような結果になることが多いのでしょうか。
typer
自動注釈ととの組み合わせはdialyzer
あまり役に立たないのでしょうか、それとも単に幸運でコードに問題がないのでしょうか?
補足:クラッシュした-spec()
ため、3 つまたは 4 つの s をコメントアウトする必要がありました。dialyzer
Erlang R13B04 の Dialyzer v2.2.0 と TypEr バージョン v0.1.7.4 を使用しています。
erlang - 異なるアーキテクチャ間での Erlang Dialyzer PLT ファイルの移植性
Dialyzer PLT の出力を別のアーキテクチャの別のマシンにコピーして使用できますか? たとえば、x86_64 Linux マシンで PLT ファイルを作成しました。x86 FreeBSD または Windows マシンでファイルを使用できますか?
erlang - Dialyzerで「ifdef(TEST)」を無視するには?
次のように define macro フラグを使用しようとしましたdialyzer -dNOTEST
が、機能しませんでした。誰にも回避策がありますか?
erlang - erlang ダイアライザーと拡張モジュール
Dialyzer は、基本モジュール内の関数の呼び出しを好みません。このエラーをスキップするためのダイアライザー フラグはありますか、それとも間違っていますか。
同様のコードを次に示します。
このコードは、期待どおりに機能します。私の唯一の懸念は、ダイアライザーの警告です。
---.erl:41: 見つからないかエクスポートされていない関数への呼び出し ---:---/3
私は何か間違ったことをしていますか、それともダイアライザーが不必要な警告を出していますか?
erlang - glpkerl (glpk erlang ライブラリ) コンパイル エラー
Ubuntu 11.10 で glpkerl ライブラリをコンパイルしようとしていますが、これまでのところ成功していません。
ずっとエラーが発生しているので、見逃している重要なものがあるかもしれません:
私が試したこと
インストールされている Erlang のバージョンは R14B02 です (ディストリビューションの公式 apt リポジトリからインストールされます)。
私の glpk バージョンは公式レポで新しいので、ここから glpk-4.38 をダウンロードしました: http://ftp.gnu.org/gnu/glpk/。このバージョンの glpk をシステム全体にインストールしたくないので、ディレクトリ ~/opt を作成し、インストールするすべてのライブラリのルートとして次の手順で使用します。
次に、glpkerldrv をダウンロードしてインストールを試みます。
make の使用中に何か問題が発生したようです。glpkerl インストール wiki に記載されているように、configure 中に --disable-hardcore を使用して、コンパイラの警告からエラーへの変換を無効にしました。ただし、それでも、次の宣言されていない識別子エラーは依然として残っています。
どうやら、handlers.c ファイルを生成する perl スクリプトには、limits.h も含まれているはずです。以下を追加して修正しました(Cの経験がないため、これが正しい方法であるかどうかはわかりません):
これで、ビルドが機能し (--disable-hardcore
警告は無視されるべきではないと思いますが、添付ファイルを参照してください)、make、make check、および make install を実行できます。
しかし、私は2番目の部分で立ち往生しています:
ビルドは正常に動作しているように見えますが、ダイアライザー エラーのためにチェックが失敗します。
どうやら、DIALYZERFLAGS を makefile に渡すことができます。
そして、ここで私はどのように進めるかわからないところです
最後のコマンドを実行した後、次のエラーが表示されます。
奇妙なことは、+debug_info パラメータが明らかに erlang コンパイラに渡されていることです (Makefile.opt ファイルにあるようです)。
現在の環境でこれを解決する方法がまったくわからないため、これ以上の調査をやめました。ここで明らかな何かが欠けていますか?ありがとう!
(タグ: erlang glpk glpkerl)
erlang - Dialyzer がこのコードを間違っていると判断しないのはなぜですか?
このチュートリアルに基づいて、以下のスニペットを作成しました。最後の 2 行 (feed_squid(FeederRP)
とfeed_red_panda(FeederSquid)
) は明らかに定義された制約に違反していますが、Dialyzer はそれらを問題ないと判断しています。これはまさに、静的分析を実行するツールでキャッチしたいタイプのエラーであるため、非常に残念です。
チュートリアルに説明があります:
関数が間違った種類のフィーダーで呼び出される前に、まず正しい種類で呼び出されます。R15B01 の時点で、Dialyzer はこのコードのエラーを検出しませんでした。観測された動作は、指定された関数への呼び出しが関数の本体内で成功するとすぐに、Dialyzer が同じコード単位内のそれ以降のエラーを無視することです。
この動作の根拠は何ですか? サクセスタイピングの背後にある哲学が「オオカミを決して泣かない」ことであることは理解していますが、現在のシナリオでは、Dialyzer は意図的に定義された関数仕様を明確に無視します (関数が以前に正しく呼び出されたことを確認した後)。コードがランタイム クラッシュを引き起こさないことを理解しています。どういうわけか、Dialyzer に常に関数の仕様を真剣に考えさせることはできますか? そうでない場合、それを行うことができるツールはありますか?
erlang - Erlang:ダイアライザーは大きなプロジェクトでは非常に遅い
Scalaris Key-Valueストアは、最大100個のモジュールを備えた大きなErlangプロジェクトです。私はこのプロジェクト内に新しいモジュールを実装していますが、ダイアライザーがプロジェクトの完全なチェックを1回実行するのにかかる時間に驚いています。ここでの私のマシンでの実行にmake dialyzer
は約200秒かかります。これは、変更を実装する際の頻繁なテストには耐えられません。
make dialyzer
次のコマンドを実行して、ダイアライザーを起動します。
モジュールに必要なファイルのみをのパラメータリストに含めることができるはずですが--src
、そのリストはおそらくかなり大きく、指定された100個のファイルを90個含めることになります。高速化するためのより良い方法はありますか後続の実行間で1つのモジュールのみが変更されることを想定したダイアライザー?
types - なぜ Dialyzer は、この楽しいコントラクトが重複するドメインを持っていると私に言うのですか?
私はオンラインブック「Learn you some erlang」を興味深く読んでおり、理解度を確認するためにいくつかの演習を試みています。
型仕様と Erlangの章で fifo の例にいくつかの変更を加え、「typed_fifo(T)」 (すべての要素が同じ型 T でなければならない fifo) を定義しようとしました。
私のタイプの仕様は次のとおりです。
-type typed_empty_fifo() :: {fifo, [], []}.
-type typed_nonempty_fifo(A) :: {fifo, nonempty_list(A), list(A)} | {fifo, [],nonempty_list(A) }.
-type typed_fifo(A) :: typed_empty_fifo() | typed_nonempty_fifo(A)。
そして、次の関数仕様で使用すると:
-spec empty (typed_empty_fifo()) -> true;
空 ({fifo、[]、[]}) -> 真;
is_list(A), is_list(B) -> false の場合は empty({fifo, A, B})。
ダイアライザーは、ドメインが重複しているため指定を無視することを通知します。
誰かがどこで間違いを犯したか教えてもらえますか?
別のポイントがあります。型付き fifo を定義しようとする前に、適切に機能するバージョンがありました。ダイアライザーは、不適切なリストの使用を妨げるものは何もないことを示しています。驚いたことに、リストの適切な/不適切な文字をテストする (ガードで使用できる) 簡単な方法が見つかりません。
これは本当に奇妙です。bif の長さ/1 を使用すると、badarg という理由で失敗する可能性があるからです。
23>L=[1,2|3]。==> [1,2|3]
24> is_list(L). ==>真
25>長さ(L)。==> 例外エラー: 不正な引数
ありがとう
erlang - ダイアライザーが型指定が無効であると判断するのはなぜですか?
私はダイアライザーを初めて使用します。この質問に答えて、誰かがダイアライザーの操作について簡単に理解できることを願っています.
数値 X と負でない整数 N を指定すると、次の関数は数値を生成すると思います。(X の N 乗)
しかし、ダイアライザーは私の仕様が好きではありません。それは私に言います:
それが示唆しているのは、過度に包括的な仕様のように私には思えます。なぜこれを行うのか、より制限的な型指定を受け入れる方法があるかどうかを誰かが説明できますか?
command-line - werl.exeのErlangダイアライザー?
dialyzer --help
werlコマンドラインから実行してみましたが、ハングしました。私は何かが足りないのですか?それはDOSシェルでのみ利用可能ですか(私はXP SP3を使用しています)?