概要
- Flowistry はRustコードの情報フロー解析ツール
- VSCode拡張機能 として統合され、フォーカスモードを提供
- 指定箇所への影響・被影響コード を可視化
- Rust 1.73まで対応、一部制限事項あり
- 研究段階ツール であり、今後の発展に期待
Flowistryとは
- Flowistry は、Rustプログラム内の情報フロー解析ツール
- あるコードが他のコードに 影響を与える可能性 を解析
- VSCode に統合され、作業中の箇所に関連するコードのみを強調表示
- 変数や式をクリックすると、 関連しないコードがフェードアウト
- 関数が大きい場合や複雑な処理の理解に役立つ
- PLDI 2022論文「Modular Information Flow through Ownership」で提案されたアルゴリズムを採用
インストール方法
- VSCode拡張機能 として提供
- Visual Studio Marketplace または Open VSX Registry からインストール
- 拡張機能ペインで「Flowistry」を検索しインストール
- Rustワークスペースを開き、インストール完了まで待機
- NixOS未対応、ARM(M1 Mac等)はソースから自動ビルド
- ソースからのインストールも可能
git clone https://github.com/willcrichton/flowistrycargo install --path crates/flowistry_ide- 拡張機能ディレクトリで
npm install→npm run build→ シンボリックリンク作成
- flowistryクレート もcrates.ioから利用可能
- ドキュメント: https://willcrichton.net/flowistry/flowistry/
使用方法
- 対応Rustバージョンは1.73まで
- Flowistryインストール後、RustワークスペースをVSCodeで開く
- 下部ツールバーにアイコン が表示
- 初回起動時は型チェックを実行、依存が多いと数分かかる場合あり
- 型チェック結果は
target/flowistryディレクトリにキャッシュ
- 型チェック結果は
- フォーカスモード の起動
- アイコンのロード完了後、「Toggle focus mode」コマンド実行
- デフォルトショートカット:
Ctrl+R Ctrl+A(Mac:Cmd+R Cmd+A) - カーソル位置の関数内で情報フローを自動解析
- 解析完了まで最大15秒程度かかる場合あり
- 変数や式をクリック すると、関連コードがグレーで強調表示
- マーク機能
- フォーカス位置を固定したい場合「Set mark」コマンド実行(
Ctrl+R Ctrl+S) - 解除は「Unset mark」コマンド(
Ctrl+R Ctrl+D)
- フォーカス位置を固定したい場合「Set mark」コマンド実行(
- フォーカス領域の選択
- 「Select focused region」コマンド(
Ctrl+R Ctrl+T)で一括選択・編集が可能
- 「Select focused region」コマンド(
制限事項・注意点
- 内部可変性(Interior Mutability)の完全対応不可
- 例:
Arc<Mutex<T>>などは、参照間の変更伝搬を正確に追跡できない - そのため、yをフォーカスしてもxの変更が反映されない場合あり
- 例:
- フォーカス領域が広くなる場合あり
- 関数呼び出し内の詳細解析は行わず、型シグネチャで近似
&mut self受け取り関数は、全体が変更される可能性として扱う
- 全てのコードが選択可能とは限らない
- MIRレベル解析とソースコードの対応付けに情報損失が発生
- 複雑な式や一時変数は正確にマッピングできない場合あり
- ネスト関数・クロージャ・asyncは個別解析
- ネストした関数やクロージャ、async関数は最小の関数単位でのみ解析
- 研究段階のためRust Analyzerより洗練度・効率性は劣る
FAQ・よくある質問
- rustupインストール失敗時
- 他ツールとの同時実行で発生、コマンドラインで手動インストール推奨
rustup toolchain install nightly-2023-08-25 -c rust-src -c rustc-dev -c llvm-tools-preview
- FlowistryがRust Analyzerに統合されていない理由
- Rust AnalyzerはMIRやborrow checker非対応のため、統合予定なし
- ハイライト挙動に関する疑問
- 既知の制限事項を参照、解決しない場合はGitHub issueやDiscordで質問可能
参考リンク
- Flowistry GitHub: https://github.com/willcrichton/flowistry
- crates.io: https://crates.io/crates/flowistry
- ドキュメント: https://willcrichton.net/flowistry/flowistry/
- Discord, Twitter (@wcrichton) でサポート提供