「Lint」の版間の差分
編集の要約なし |
|||
11行目: | 11行目: | ||
== lintで警告が出る例 == |
== lintで警告が出る例 == |
||
< |
<syntaxhighlight lang="c"> |
||
int foo(int count) { |
int foo(int count) { |
||
int sum = 0; |
int sum = 0; |
||
22行目: | 22行目: | ||
} |
} |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
上記の例の場合、<code>foo()</code> は、<code>sum</code> が100以上であれば値を返すが、それ以外の時には値を返さない。これはC言語の構文的には合法だが、実行時エラーなどの未定義動作を引き起こす。そのため、lint では警告が出る。 |
上記の例の場合、<code>foo()</code> は、<code>sum</code> が100以上であれば値を返すが、それ以外の時には値を返さない。これはC言語の構文的には合法だが、実行時エラーなどの未定義動作を引き起こす。そのため、lint では警告が出る。 |
||
2020年7月5日 (日) 22:46時点における版
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 を使わなければ検出できなかった類のミスも、コンパイル段階で検出できるようになっているものがある。上記の例は、Microsoft Visual C++では既定で C4715 の警告が生成され、コンパイルオプション/we"4715"
を指定することでコンパイルエラーになる。GCCやClangではコンパイルオプション-Wreturn-type
を指定することで警告が生成され、また-Werror=return-type
を指定することでコンパイルエラーになる。
後発のプログラミング言語では安全性を考慮して、上記のようなコードを常に非合法とし、必ずコンパイルエラーにしてしまう仕様となっているもののほうが多い。C言語では仕様により動作が厳密に規定されていない事項が非常に多く、そのためコンパイラやlintによる警告に頼らなければならないことが多い。
「lint」の派生用法
転じて、C言語に限らず、各種言語で書かれた文書に対して構文チェックやコード解析を行うプログラムも、lint と呼ばれるようになった。この意味での lint の代表例としては、HTMLの文法チェックを行う Another HTML-lint がある。Android StudioではJavaおよびKotlinで書かれたコードに対して静的解析が利用可能だが、lint自身がJava/Kotlinで実装されている[1]。