lint とは、主にC言語のソースコードに対し、コンパイラよりも詳細かつ厳密なチェックを行うプログラムである。静的解析ツールとも呼ばれる。
- 型の一致しない関数呼び出し[要説明]
- 初期化されていない変数の参照がある
- 宣言されているが使われていない変数がある
- 同じ関数を参照しているが、戻り値を使う場合と使わない場合がある[疑問点 ]
- 関数が戻り値を返す場合と返さない場合がある
など、コンパイラではチェックされないが、バグの原因になるような曖昧な記述についても警告される。構文(シンタックス)レベルのチェックだけでなく、意味(セマンティクス)レベルのチェックまで実行するものもある。
lintで警告が出る例
int foo(int count) { int sum = 0; int i; for (i = 1; i <= count; ++i) { sum += i; } if (sum >= 100) { return sum; } }
上記の例の場合、foo()
は、sum
が100以上であれば値を返すが、それ以外の時には値を返さない。これはC言語の構文的には合法だが、実行時エラーなどの未定義動作を引き起こす。そのため、lint では警告が出る。
ただ、最近[いつ?]のコンパイラは、細かな警告やエラーを出す機能が強化されているため、以前は lint を使わなければ検出できなかった類のミスも、コンパイル段階で検出できるようになっているものがある。上記の例は、では既定で C4715 の警告が生成され、コンパイルオプション/we"4715"
を指定することでコンパイルエラーになる。GCCやClangではコンパイルオプション-Wreturn-type
を指定することで警告が生成され、また-Werror=return-type
を指定することでコンパイルエラーになる。
後発のプログラミング言語では安全性を考慮して、上記のようなコードを常に非合法とし、必ずコンパイルエラーにしてしまう仕様となっているもののほうが多い。C言語では仕様により動作が厳密に規定されていない事項が非常に多く、そのためコンパイラやlintによる警告に頼らなければならないことが多い。
「lint」の派生用法
転じて、コードをチェック・解析することをlint[1]、lintを行うプログラムをlinterと呼ぶ[2]。linterの例にはHTMLの文法チェックを行うAnother HTML-lint がある。Android StudioではJavaおよびKotlinで書かれたコードに対してlint(静的解析)が利用可能である[3]。
コンパイラが存在する言語の場合、静的コード解析にコンパイラとlinterを併用することで、字句/構文チェックと意味論的チェックを実現できる。リアルタイムに動作するlinterを利用すれば、コーディングしながら常時lintingを行える。例えばVSCode上でTypeScriptコードを書く場合、字句/構文チェックを担うtsserver
[4]とlintingを担うESLint
を用いてコーディング中に常時静的コード解析が走る状態を実現できる。
lintingをおこなっても即座にバグが発見されるわけではない(lintエラー≠コンパイルエラー)。lintingの主たる目的は低品質コードの検出によるバグの予防である。linterは「エラーをしばしば引き起こすパターン[5]」あるいは「エラーを避けるベストプラクティスパターン[6]」を用いて品質の低いコードを検出する。検出された低品質コードを改善することにより、バグが埋め込まれる可能性を低減しバグを予防できる。
脚注
- ^ "lint/linting"の用例: Linting Python in Visual Studio Code - VSCode
- ^ "linter"の用例: ESLint - Pluggable JavaScript linter
- ^ lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks - platform/tools/base - Git at Google
- ^ (Language Server Protocol)likeなプロトコルでリアルタイム動作するTypeScriptコンパイラ/Language server。VSCode組み込み。
- ^ Possible Errors: These rules relate to possible syntax or logic errors Rules - ESLint
- ^ Best Practices: These rules relate to better ways of doing things to help you avoid problems Rules - ESLint
関連項目
外部リンク
- man page for lint - Unix & Linux Commands