Why Static Analysis Sucks

仕事のコードベースで静的解析が強化され、なにかと presubmit check が失敗するようになってしまった。静的解析、昔は憧れがあったし今もまあ有用ではあると思うけれども、すきになれないなあ。

静的解析は、言語のセマンティクスを変えている(狭めている、といっても良い。有効なコードの範囲が減るので。)しかしその変更は、言語のデザインとは別に追加されている。そして静的解析の都合で言語側のデザインが変わることはない。デザインを変えられないから外側のツールとして動いているわけで。

結果として静的解析を通すためのコードは cumbersome になりがちである。自分が一番嫌なのは、コンストラクタの中でメソッドを呼べない(呼びにくい)という制限。コンストラクタが終わるまでオブジェクトは未初期化かもしれないから、未初期化のものを触る際の制限を受ける。でもさー・・・たとえば Android の View とかってのはコンストラクタの中で色々やる前提でデザインされている。コンストラクタがシステムから呼ばれるので、たとえば factory method でコンストラクタをラップして factory method 側で初期化処理の仕上げをする、とかはできない。もっと端的にいえば、もし Android 本体に自分のチームが使っている静的解析をかけたらやまほどエラーができると思う。

結局のところ、言語機能になってるべきものを外側で誤魔化そうとするから歪みが出る。コンパイラの警告も静的解析に似た annoyance があるけれど、それほど理不尽には感じない。あれらは言語の機能と密着しているので、基本的にはその言語として良いコードを書けば直るようになっている。静的解析は違う。言語の外側に作られた静的解析用の DSL, というか annotation を頼るわけだけれど、こいつは言語の思想とは必ずしも会ってないので歪みが生まれる。

なので静的解析のようなものは言語処理系が(言語のデザインも含めて)提供すべきであって、あとづけ、そとづけの静的解析はいまいちだと思う。ま、言語を直せないから仕方ないんだけど。誰か Safe Java みたいのをつくってほしいもんです。というか Kotlin があればいいです。