LGTM でリポジトリ・ソースコードを分析しよう

2020.02.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

LGTM とは

LGTM は、コードを分析するためのツールです。

https://lgtm.com/

CodeQL という技術を使って、ソースコードに対してクエリを投げることで、例えば脆弱性のありそうなコードのパターンや、不具合のありそうなコード、規約を満たしていないコードなどを検査することができます。

コードに対して検査をかけたり、もしくは以下のサービスと連携してプルリクエストに対して毎回検査を行うことが可能です。

  • Bitbucket Cloud
  • GitHub.com
  • GitLab.com

言語については以下に対応しているとのことです。

  • C and C++
  • C#
  • Go, also known as Golang
  • Java
  • JavaScript/TypeScript
  • Python

CodeQL について

CodeQL is the code analysis platform used by security researchers to automate variant analysis. You can use CodeQL queries to explore code and quickly find variants of security vulnerabilities and bugs. These queries are easy to write and share–visit the topics below and our open source repository on GitHub to learn more. You can also try out CodeQL in the query console on LGTM.com. Here, you can query open source projects directly, without having to download CodeQL databases and libraries. (https://help.semmle.com/QL/learn-ql/ より引用)

といった感じですが、要するにコードに対してクエリを投げると、クエリにマッチした値が返ってくるやつです。 ここで、例えばクエリが「冗長なコードのパターン」であれば冗長なコードを見つけられるし、「脆弱性のありそうなコードのパターン」であれば、脆弱性のありそうなコードを見つけられる、と言った感じです。

例えば以下はこちらのページで紹介されているクエリの例となります。このクエリでは、条件式にかかわらず、何も行われないような if 文を検出できます。

import java

from IfStmt ifstmt, Block block
where ifstmt.getThen() = block
  and block.getNumStmt() = 0
select ifstmt, "This 'if' statement is redundant."

以下のようなコードを検出することができます。

// value が true でも何もしない
if (value) {
}

他にも組み込みで多くのクエリあり、Java だけで現在165個のクエリがデフォルトで用意されています。

例えば、以下のようなクエリがあります。

やってみる

リポジトリを LGTM に登録してみる

https://lgtm.com/ からログインします。今回は GitHub のアカウントでやってみます。

リポジトリの URL を入力して Follow をクリックします。せっかくなのでいろいろコードがやばそうなリポジトリを指定してみました。

分析が始まるので、待ちます。

分析が終わると結果をみることができます。 他にも突っ込みどころがありそうですが、使ってない変数が検出されました。

Code quality は納得の D です。

独自定義のクエリを投げてみる

Query console から言語と対象のリポジトリを選択します。

クエリを入力し、実行します。

クエリにマッチするコードが検知されました。

プルリクエストに対する検査を実行してみる

Project list から当該のリポジトリの Enable PR code reviews を選択します。

install the app からインストールを行います。

インストールが完了したリポジトリにプルリクエストを投げると、LGTM による分析が始まります。

差分に含まれる利用していない変数が新たに検知されました。

まとめ

LGTM は、コードを分析するためのツールです。

CodeQL という技術を使って、ソースコードに対してクエリを投げることで、例えば脆弱性のありそうなコードのパターンや、不具合のありそうなコード、規約を満たしていないコードなどを検査することができます。

  • Bitbucket Cloud
  • GitHub.com
  • GitLab.com

との連携に対応しており、言語は

  • C and C++
  • C#
  • Go, also known as Golang
  • Java
  • JavaScript/TypeScript
  • Python

に対応しています。

クラスメソッド の事業開発部ではソフトウェアエンジニアを募集しています

現在私は事業開発部で prismatix というサービスの開発に携わっています。 そして、事業開発部ではソフトウェアエンジニアを募集しています。

もし興味のある方がいましたら、こちらのページを見ていただけますと幸いです。

私からは以上です。