How to Build Static Checking Systems Using Orders of Magnitude Less Code http://dl.acm.org/citation.cfm?id=2872364
コード解析ツールは複雑になりすぎてて、開発が大変になってるし、新しい言語に対応するのも困難になってしまっている。 それに対して、言語の構文や意味をきちんと扱う完全なフロントエンドを作るのではなく、意図的に単純化した不完全な文法(micro grammar)に基づいたパーサを用いることで、2500行という桁違いに少ないコード量でcompetitiveな検出能力を持つ解析ツールを作れて、新しい言語への対応も容易になるよ、というような話。
レキサとパーサはHaskellのParsecで書いてる。 もともとはPythonで書いてたからこのアプローチは実装言語には依存しないと言っているけれど、行数はHaskellだから短くなった部分もありそう。 もっとも、Haskellerにはこういうアドホックなアプローチを考える人は少ないかも知れないけれど。
あと、余談ながら “belief-style” checkers という言葉を初めて知った。 これは x/y という割り算があれば「yは0でない」という信念、デリファレンスされていれば「nullではない」といった信念、nullチェックしていれば「nullかもしれない」といった信念を適切に伝播していって、矛盾する信念があったときに問題を報告するタイプのチェッカ。
上の方の必ず通る側で無い path で if (x == nullptr) { return ; } とか書いてて下で x.foo とか書いてると『おめー場合によっちゃ null が来る事があると思ってるよな? いいのかゴルァ』って怒られます