資源リーク検出
ファイルや接続の閉じ忘れが、本番でじわじわ効いてきていませんか。
無料ベータ・面談制/正式版は有料提供予定
前提:決定的層はPythonのみ対応(python以外はLLM層のみに委譲)
- 所要時間: 30分
- 進め方: 現場の状況をヒアリングし、最初に効くツールと順番を一緒に決めます
- ご準備は不要です
概要
資源の解放漏れは、つくった直後は動いてしまい、ハッピーパスのテストもすり抜けます。本番で実行を重ねるうちにハンドルや接続が積み上がり、ある時だけ開けない・つながらないという再現困難な障害になります。実装の瞬間に「閉じていない資源」を機械的に拾い、枯渇が起きる前につぶすためのツールです。
効果
- 本番で徐々に進行し再現が難しい資源枯渇障害を、実装時に先回りで防ぐ。
- ファイル・接続・ロック・サブプロセスごとに位置・深刻度・直し方が出るため、その場で直せる。
- 決定的なので同じ入力には必ず同じ結果=CIで件数・重大度をしきい値にしてゲート化できる。
- 誤検出を避ける保守的判定(with や対応する後始末があれば陰性)でノイズが少ない。
- それでも残る誤検出は report_outcome で報告すればallowlistに載り、以後は自動で抑制される(サーバは何も保存しないステートレス設計)。
インプット
- 実装コード
汎用LLMとの違い
どの呼び出しを資源確保とみなし、どの後始末を解放とみなすか(資源カタログ・確保と解放の対応規則)が bubo 独自の中核です。汎用LLMに「資源リークしてない?」と聞くより、構文木の規則照合で漏れなく・再現性高く拾い、with や対応する後始末を確認できる箇所は陰性にしてノイズを抑えます。
実際の入力と、返ってきた出力
同じコードと問いかけを、汎用AIと resource-leak-lint にそのまま渡した実際のやりとりです(要約ではありません)。
def persist_state(state: str, db_path: str = _DEFAULT_DB_PATH) -> None:
conn = sqlite3.connect(db_path)
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS device_state (id INTEGER PRIMARY KEY, value TEXT)")
cur.execute("DELETE FROM device_state")
cur.execute("INSERT INTO device_state (id, value) VALUES (1, ?)", (state,))
conn.commit()
def load_state(db_path: str = _DEFAULT_DB_PATH) -> str:
with sqlite3.connect(db_path) as conn:
conn.execute("CREATE TABLE IF NOT EXISTS device_state (id INTEGER PRIMARY KEY, value TEXT)")
row = conn.execute("SELECT value FROM device_state WHERE id = 1").fetchone()
...
SQLite接続のリークは的中させましたが、それとは別に「自己診断(run_selftest)がALARM復元後のブザーを無条件でOFFにする」というラベル外の指摘を最重要点として提示しました。これは実在しうる懸念ですが、リソースリーク観点の質問に対する回答としては論点がずれています。
verdict = block。3件検出(すべて unclosed_connection/high) - persist_state (line 31) — 接続が確実に解放されていない - persist_state (line 32) — 同上(カーソル) - load_state() — 「with sqlite3.connect(...) はコミット/ロールバックのみで接続自体はcloseしない」という、見落としやすい仕様を明示して指摘 recall = 1.0(既知欠陥を的中)。
汎用LLMは「なんか問題ある?」という開かれた質問に対して指摘の幅を広げがちで、本来の観点(リソースリーク)以外の指摘に紙面を割いてしまうことがあります。resource-leak-lintは観点を固定した決定的解析のため、with文があっても接続がcloseされない見落としがちな仕様も一貫して拾います。
社外秘のコードを、どう守るか
buboは入力を保存しません
ツールに渡したコード・仕様・データを、buboのサーバーは保存しません。bubo自身が学習に使うこともなく、処理はその場限りです。
AIに送るか・どこへ送るかは、あなたが握ります
標準のキーレス接続では、意味を読む処理は普段お使いのAIクライアントの中で実行されます。データの扱いは、お客様とそのプロバイダの既存のご契約のもとにあり、buboがAPIキーやコードをお預かりすることはありません。ご自身の契約するプロバイダを直接指定したい場合は、BYOK(Bring Your Own Key)として任意で設定できます。
AIに送らず動くツールも多くあります
多くのツールは決定的な静的解析だけで完結し、LLMに渡すのは必要な場面に限られます。AIに送る範囲を、あなた自身で絞り込めます。
ワンタイムコードは単回使用・有効期限7日・サーバーに平文保存はしません。発行したトークンは設定ファイルに直書きせず環境変数で参照します。既存のMCP設定がある場合も、壊さず冪等にマージします。
どう申し込み、どうつなぐのか
1. 面談を予約する
予約フォームから面談をお申し込みください。現在のQAの困りごとと、試したいツールをお聞かせいただきます。
2. 面談で適用先を一緒に決める
そろえたツールのうち、貴社の工程で効く順番をご一緒に見立てます。ワンタイムコードと接続コマンドは、面談後にあわせてお渡しします。
3. コード1つ、コマンド1行で接続
お受け取りしたワンタイムコードで、コマンドを1行実行(Windows / mac / Linux 各1行)。有効化・MCP設定(.mcp.json)生成・環境変数設定まで自動で完了します。あとはAIクライアント(Claude Code / Gemini CLI)を再起動するだけで、そのままQA方法論を呼び出せます。APIキーのご用意は不要です。ご自身の契約するLLMを使いたい場合は、BYOK(Bring Your Own Key)として任意で設定いただけます。