オープンソースのコード分析ツールSourcetrailを使ってみた

概要

Sourcetrailという、ソースコード分析ツールがオープンソース化して、無料で使えるようになったので、Arduino core for the ESP32を分析してみました。

セットアップ

上記からSourcetrail_2019_4_61_Windows_64bit_Portable.zipをダウンロードしてきて、展開しました。

セットアップしなくても使えるポータブル版があるのは便利です。

使い方

New Project

プロジェクトの名前と、保存場所を設定します。プロジェクト名はなんでも大丈夫で、保存場所は環境変数を入れるとおかしな動きをしたので、絶対PATHで指定してください。

標準的な保存場所は実行ファイルがあるPATH直下の「user\projects\プロジェクト名」です。

Add Source Group

Empty C++を選びました。

C++のバージョンは、Arduino IDEのコンパイルオプションから確認して「gnu++11」を選択。

ソースファイルは「%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/」を指定しました。セットアップしているバージョンに合わせて変更してください。

「show file」ボタンで対象となるファイルが含まれているかを確認してから、次に進みます。不要なファイルが含まれていたらExcluded設定で除外します。

「%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp」は除外してもいいかもしれません。

ここが一番面倒で、ワイルドカードが使えないので、Include Pathを右下の鉛筆マークを押してから、テキストで流し込みます。

C:/Program Files (x86)/Arduino/hardware/tools/avr/lib/gcc/avr/7.3.0/include
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/1.22.0-80-g6c4433a-5.2.0/xtensa-esp32-elf/include/c++/5.2.0
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/cores/esp32
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/config
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/app_trace
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/app_update
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/asio
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/bootloader_support
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/bt
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/coap
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/console
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/driver
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/esp-tls
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/esp32
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/esp_adc_cal
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/esp_event
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/esp_http_client
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/esp_http_server
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/esp_https_ota
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/esp_ringbuf
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/ethernet
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/expat
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/fatfs
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/freemodbus
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/freertos
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/heap
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/idf_test
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/jsmn
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/json
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/libsodium
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/log
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/lwip
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/mbedtls
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/mdns
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/micro-ecc
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/mqtt
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/newlib
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/nghttp
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/nvs_flash
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/openssl
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/protobuf-c
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/protocomm
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/pthread
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/sdmmc
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/smartconfig_ack
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/soc
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/spi_flash
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/spiffs
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/tcp_transport
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/tcpip_adapter
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/ulp
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/vfs
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/wear_levelling
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/wifi_provisioning
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/wpa_supplicant
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/xtensa-debug-module
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/esp-face
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/esp32-camera
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/esp-face
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/sdk/include/fb_gfx
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/ArduinoOTA/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/AsyncUDP/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/AzureIoT/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/BLE/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/BluetoothSerial/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/DNSServer/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/EEPROM/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/ESP32/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/ESPmDNS/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/FFat/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/FS/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/HTTPClient/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/HTTPUpdate/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/NetBIOS/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/Preferences/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/SD/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/SD_MMC/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/SimpleBLE/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/SPI/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/SPIFFS/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/Ticker/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/Update/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/WebServer/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/WiFi/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/WiFiClientSecure/src
%USERPROFILE%/AppData/Local/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/Wire/src

私が指定したのは、上記です。M5StickCなど他のライブラリを解析するときにも、上記のリストをベースに増減するとうまくいくと思います。

こちらも設定したら「validate include directives」ボタンで、エラーが発生していないか調べます。何個か他の環境用のファイルが見つかっていませんが、必要そうなのが揃っていたら無視しても構わないと思います。

「mbedtls/esp_config.h」を読み込ませる設定が入っていないからな気もします。

Globalの方は、たぶんいらないので消せるのは消します。

Compiler Flagsはちゃんと指定したほうがいいかもしれませんが、全部削除。

New Project

設定が完了すると、最初の画面に戻ってきますので「Create」で作成します。この画面は作成したあとでも、ProjectメニューEdit Projectで開くことができます。

Start Indexing

Startで分析を開始します。この画面はEditメニューからRefreshで開けます。

初期画面

エラーが何個かでていますが、分析完了しました。

HardwareSerialを見てみる

こんな感じの構成が見えます。

HardwareSerial::writeを見てみる

こんな感じで、関係と右側にソースと宣言が開きます。

Doxygenと比べる

  • HardwareSerial.cpp
  • HardwareSerial クラス
  • HardwareSerial::write

Doxygenはテキストがメインで、構造は図ではなく情報から自分で組み立てる必要があります。

Sourcetrailはきれいですが、Doxygenなどに使うドキュメントブロックは認識しません。Doxygenできれいに管理されているのであれば、 Doxygenで見たほうが楽かもしれません。

まとめ

人によってデータ解析の方法が違うので、図で認識する人はSourcetrailを使ったほうが便利だと思います。文字で認識する人はDoxygenかなー。

DB定義書がER図じゃないと構造が頭に入りにくい人と、脳内デバッグするからSQL文とサンプルデータの方がいい人がいるみたいな感じだと思います。

コメント