この話は終了になりますよ。これはコードレビュー自体を完全に自動化するためのものではなく、前準備、結果の公開・共有・利用などを支援するツールなので、コードレビュー自体は自力で行う必要がある。絡みのバグを見付けたという話と、ツールを使っての所感なんかを書く。この記事の半分は雑な日記みたいなものなのでスッ飛ばすのが良い。前提このセクションは、わかっている人は読み流しても問題ない。言語の時代から「他人が書いた他のライブラリに依存したコードを書く」という状況は少なからずあったわけだが、現代的な環境ではこれが殊更に加速している。開発環境やツールチェインが外部ライブラリの簡単な利用や、ライブラリの簡単な公開をサポートしているためである。すると、外部ライブラリの利用や公開への障壁が小さくなり、より小さな機能やマイナーな機能を提供するライブラリの利用や公開が加速し、結果としてプロジェクトの依存関係は膨らみがちになる。依存ライブラリに深刻なバグや悪意あるコードが紛れ込むと自分のプロジェクトまでそのコードを抱えることになるため、できればこれは避けたい。依存先プロジェクトが少なければ、依存先のライブラリを自分の目で確認することもできるかもしれない。依存先プロジェクトが有名であれば、多くの人によって確認されたコードは信頼できるかもしれない。そのどちらでもない場合、プロジェクトが依存しているコードは本当に安全であるといえるだろうか?......という問題も、今に始まったことでなく昔から議論されていたのだろうが、問題を認識しつつ末端の趣味開発者として実際にできることはそんなに多くない。することもできるだろうが、趣味のプロジェクトでそこまでできる人もそういまい。加えて、監査する主体にも社会的信用がなければ、見ず知らずの人が「このコードは信用できます!」などと言ったところで誰も信用しないだろう。いった現状も相俟って、「このコードは信用できます!」と主張する人自体がそもそも少ない。そんなわけで、世間のコード、また我々が利用するコードの大部分は、安全であるということが明確に認められないままなんとなく利用されている。起きているからである。injected」などでググれば、関連する記事が多数発見できる。コードを信頼するか決めるにあたって、以下のことが大きな障害となる。Trust上記の問題について、実のところ1番目と3番目については技術的な解決策が昔から知られている。本当に本人のものであると信用すべきかという問題を解決する仕組みである。これにより、「信頼できる友人の言ならまあ信用できるし、信頼できる友人が信頼しているという別の友人の言ならそこそこ信用できる」という自然な仕組みをコンピュータの世界に持ち込める。この仕組みは「○○は万人が信用しているものとする」といったような天下り的な信用を必要とせず機能するため、多数の多様なユーザが存在する状況においてもうまく機能を発揮できる。ついて語る前に、コードレビューについて軽く説明しておく。多くの場合、コードレビューとは、プロジェクトのメンバーやリポジトリの管理に責任や強い権限を持っている人が、プロジェクトに取り込むコードの品質や問題を確認するものである。場合、特に個人開発の小規模なプロジェクトでは正式なメンバーは一人か数人であることが多い。コードの品質を確認し、必要に応じて修正を求めたり自ら修正するというものになる。いったコードレビューは、プロジェクトのコードそのものというより、実際には「コードへの変更」をレビューするものである。依存先プロジェクトのコードを信用できるかという文脈で考えるとき、コードの品質はプロジェクトの管理者やメンバー当人ばかりでなく、第三者の目による品質確認もあった方がよい。悪意ある開発者や問題に気付かない開発者は自分のコードは信用できると言い張るだろうが、多数の人々が確認をすれば、そのうちいくらかの人は問題に気付いて指摘できるかもしれないからである。この場合、どちらかというとコードレビューは品質保持のための手順というよりは、既にあるコードに不正や問題がないか確認する監査に近いものである。ここでの監査のようなコードレビューは、各々の小さな変更ではなく、今あるコード全体、特定のバージョンのスナップショットそのものについてのレビューが求められる。モデルに基いてそれらのコードレビューへの信用をうまく活用できるようにしようという仕組みである。以下のようなモデルで動作する。コードレビュー結果」を各々の決めた場所で公開する。仕組みによって偽造が困難に、また検出可能になっている。コードレビュー情報の利用者は、自分の信頼・信用するレビュアーを足掛かりに、信頼するレビュアーが信頼する別のレビュアーなど様々な人々によるレビュー情報を取得し、ローカルで信用度情報を算出し利用する。ユーザが誰を信用しているかによって、ローカルで算出されたプロジェクトの信用度は異なるということである。これにより、次のような結果が期待できる。自分が信頼・信用した人の目を通してコードが信用できるかを、ある程度主観的かつ自動化して判断できる。ここでいう自動化とは、「あなたはこれを信用していますか?」といちいち尋ねる必要がないという意味であって、人の脳を介さずにコードを機械的に検査するという意味では断じてない。信頼の連鎖はポジティブなものだけでなく、たとえば「私が信頼している人が信頼しないことにした人によるレビュー」は、信頼度が低いものとして結果の算出に利用される。いった意味でも、何を信頼・信用するかをユーザ個々人に合わせて決めることができる。自分のコードレビュー結果を、偽造・改竄される心配なく、手軽に、かつ利用しやすい形で、広く公開できる。信頼されるレビューの積み重ねが、さらにレビュアーの信頼へと繋がっていくことで、レビュアー自身のブランディングとしても機能する。逆に、信頼できないレビューや雑なレビューが多いと、もちろん人々からは信頼されなくなっていく。とエラーメッセージを読めば必要なことはわかるだろう。この節では、コードレビューをするうえで私が意識したことを記す。個人の信念や言語によって異なる部分も多いかもしれないので、参考程度のものである。文中に軽率に「改善を提案」やら「修正を投げる」など書いているかもしれないが、その場合言葉通りの意味である。あなたに問題を発見できたならあなたはその発見を報告することができるし、あなたが改善策を思い付いたならあなたはそれを提示することができる。コードレビュー中に何か引っ掛かりを覚えた時点で、既にレビュアーはプロジェクトに貢献できるレベルにあるということである。利用する権利は万人に開かれており、大抵の場合開発の場や問題報告の場もオープンである。貢献できるチャンスがあるなら、いつ来るとも知れぬ誰かを待ち続けるよりも、さっさと自分で解決してしまうのが良い。何をレビューするか最初に考えるのがこれである。ものを適当に選んでみるのが良い。何を選んでも良いのだが、いきなり大きなコードと向き合うよりは、小さなもので慣らしていくのが良いだろう。自分が貢献したことのある他人のプロジェクトがあるなら、それをレビューするのも良いだろう。場合によっては自分が書いた以外の部分まで目を通したこともあるだろうから、コードへの理解は初めて読む人よりは進んでいるはずである。使ったことのある機能や弄ったことのある部分を端緒として理解を広げていくと、どこから始めるか考える手間が省ける分やりやすいかもしれない。したことがあるプロジェクトやその依存についてチェックしていくのも良い。大事なのは、完全に利他的なボランティアとしてやるのではなく、「将来の自分がより安全なコードを使うための投資」として自分の利益を念頭にコードを読むことである。レビューが集まった結果として利用者全体を利することはあるだろうが、開発にせよレビューにせよバグ報告にせよ、自分自身の利益を度外視した活動は持続しないものである。関わるなら、自分に縁のありそうなものから選ぶのがモチベーションも保ちやすくて良いだろう。悪意あるコード片はあるか?レビューするうえで、これがまず、何よりも見落としたくないものである。通常のバグであれば発現は条件次第だろうし、場合によってはユーザ側での回避策もとれる。実害が出るとも限らない、ガチャのようなものである。悪意あるコードは過去・未来に渡るプロジェクト自体の信用を疑わせるものであり、実害の発生した可能性は極めて高く、場合によっては既に実行された結果起きたとについても調査が必要になるかもしれない。ゆえに、この観点で疑わしいことを放置しては、コードの信用を論ずることはできず、そもそもコードレビューの意味がない。以下で挙げる観点は悪意の発見のみに使うものではないが、資するところは大きいであろうと思われるものである。それはそこにあるべきか?簡単に発見できる不自然なコードとして、そもそもモジュールや関数が司るものでない処理をしているものなどがある。データ構造を司る部分なのにネットワーク通信をしているとか、数値計算なのにファイルの読み書きをしているとかである。(たとえば数値計算でキャッシュや結果書き出しとしてファイルを利用することがあるかもしれない)、つまり機械的な判断は困難であるため、人が解釈してこれが妥当な処理であるか確認する必要がある。そんなしょうもない悪意があるものかと思うかもしれないが、実際に起きうることである。長大なスクリプト中に、1行だけ「ホームディレクトリを削除する」というコマンドが紛れ込んでいたら、プロジェクト管理者一人でチェックしただけでは見逃してしまう可能性は十分にある。嫌がらせ目的では、シンプルなファイル削除はコストパフォーマンスが極めて良い。外的な要因でプロジェクト自体が改竄されて公開されてしまうということもありうる。悪意のない処理だとしても、そういった「場違いな処理」が紛れ込んでいるコードはそもそも品質が高くないといえる。いった処理は「品質が高くない」と指摘してやる気ある人々の注目をその箇所に集めるなり、自分の手で修正するなりすることで、将来的により信頼度の高いプロジェクトにすることができるだろう。パスなどであろうが、定数やリテラルなどが存在する場合、それがどのような目的でその値になっているか確認すべきである。悪意がなくとも、それがハードコードされているべきでないなら変数や定数に分離するなどの改善を提案することはできる。何をどう変更している?他に悪意やバグの紛れ込む余地のある部分は、値の変更部分である。不審な定数を発見しづらくするため難読化していることもありうるし、有害な処理をそうとわかりづらくしているのかもしれない。「何を変更しているか」「どのように変更しているか」「ここでそのアクセスや変更は自然か」あたりを気にしながら読んでいく。複雑な計算が何をしているのかどうしてもわからなければ、「この部分はわかりづらいのでコメントを付けた方が良い」などと問題を指摘すれば将来の貢献者が幸せになるかもしれない。レビュー結果に「理解できなかったが、やたら不透明で複雑な処理をしている箇所があった」などと記すのも良い。理解度が低いとマークしておけば、レビューの信頼度の減衰度を高く設定することができるため、「一応わかる部分はチェックしたけどあまり信用しないでくれ」という情報も正しく伝えることもできる。