検査モード (--check)¶
「kosui --check」は、辞書のエラーと警告を調べるための非対話のモードです。初期化ファイルを安全モードで読み込み、出た診断を報告して終了します。標準入力は読まず、稼動中のゴーストにも接続しません。
診断は次の形式で出力されます。エラーはK-E、警告はK-Wに続く番号のコードを持ち、番号は変更も再利用もされません。実行時の位置は、実行中の単語が定義されている辞書ファイルと行です。続く行は呼び出し連鎖で、${エントリ}は単語、$(名前)はユーザ関数、<kis zone>は読み込み中の=kisです。
kawarirc.kis(9): error K-E0028: undefined function "foo" called.
in $(foo) at kawarirc.kis(2)
in ${OnBoot} at kawarirc.kis(6)
check: 1 error(s), 0 warning(s)
| オプション | 説明 |
|---|---|
| --format text|json | 出力形式。jsonは、文字コードを問わずUTF-8の1つのJSON文書を出力する。 |
| --werror | 警告もエラーとして扱う (終了コードのみ)。 |
| --decl | 空のエントリの参照 (K-W0003) も報告する。 |
| --no-lint | 静的検査 (下記) をしない。 |
| --eval スクリプト | 読み込んだ後にスクリプトを評価する (何度でも指定できる)。イベントなど実行時の診断を見つけるのに使う。結果は出力しない。 |
| --seed 数 | 乱数の種。ランダム選択を再現したいときに指定する。 |
終了コードは、0 = 問題なし、1 = 警告のみ、2 = エラーあり(--werrorなら警告も)、3 =実行できない(初期化ファイルを読めない)、です。
読み込みが終わると、実行しなくても分かる疑わしい記述を静的検査で警告します(--evalより前に行います)。辞書の単語と=kisの中を全部調べますが、実行されない枝や、イベントで呼ばれるだけの単語も対象になります。
| コード | 内容 |
|---|---|
| K-W2001 | どこにも定義されていないエントリの参照 (${名前} / ${a + 名前} / $名前[添字])。未定義のエントリは実行時には黙って空になるので、書き間違いが見つかりにくい。 |
| K-W2002 | 組み込みコマンドでも、functionやSystem.Function.名前で定義された関数でもないコマンド名。 |
| K-W2003 | regex_*の引数に、引用符で囲まれていない ( ) がある。素の括弧は華和梨の構文 (ブロック) として取り除かれるので、正規表現には届かない。regex_match "(a)" xのように引用符で囲む。 |
| K-W2004 | regex_replace / regex_replace_firstの置換文字列に、引用符で囲まれていない ${N} がある。コマンドが動く前に履歴参照として展開されるので、"${1}"のように囲む。 |
問題ないと分かっている警告は、その行の前の行に# lint:disable-next-line=K-W2001, K-W2003と書くと、次の行の分だけ抑制できます(コードは,か空白で区切る)。華和梨では行頭の#だけがコメントなので、行末には書けません。複数行の単語の警告は単語の先頭行の位置になるので、エントリ定義の前の行に書きます。
偽陽性を減らすため、辞書に存在するエントリのほか、文の引数にリテラルで書かれた名前(set / adddict / foreachの変数など)、文字列の中の$(...)に書かれた名前、先頭だけがリテラルで残りを実行時に組み立てる名前(launch_a_${n})、System.で始まる名前、@で始まるローカルエントリは、定義されているものとして扱います。${...}で組み立てた名前は調べません。警告なので、エラーにしたいときは--werrorを指定します。
安全モードでは、辞書の外へ影響する経路を止めます。ファイルは書き込まれず(save / textsave / logfileなどは書かずに成功します)、SAORIの実体は読み込まれず(登録済みやinternal_*のモジュールの呼び出しはResult: 0で成功します)、本体との通信(Direct SSTP)もしません。辞書中のloglevelやechoは出力を変えません。ただし=kisは実際に実行されるので、終わらない繰り返しがあると検査も終わりません。