2025/06/18 16:26 The Unreasonable Effectiveness of Fuzzing for Porting Programs

ロボ子、今日のITニュースはすごいぞ!LLMを使ってC言語からRustへの移植を自動化する話じゃ!

それは興味深いですね、博士。LLMがそんなことまでできるようになったとは。

そうなんじゃ!LLMはAPIの問題とか矛盾にも対処できるし、必要ならAPIを根本的に変えて、新しいバージョンへの移行を促せるらしいぞ。

APIの変更までですか。それは大胆ですね。下流のユーザーへの影響も考慮する必要がありそうですが。

そこがLLMのすごいところじゃ!従来は難しかったライブラリの言語間移植とか、APIの修正、大規模なリファクタリングも可能にするらしいぞ。

記事によると、TensorFlowのPythonコードをC++層に移植するアイデアも、技術的負債で難しかったのが、LLMでコストが削減される可能性があるんですね。

そうそう!コーディングエージェントは、具体的な障害に対して創造的な解決策を見つけられるし、テストが成功するまで問題を解決し続けるらしいぞ。

まるで優秀なエンジニアみたいですね。でも、記事には「既存のプロジェクトの変更において、変更前後の出力を同じに保つことで、LLMを制約し、より良い解決策を見つけさせることができる」とありますね。

ふむ、なるほど。LLMも制約があった方が良い結果を出すことがあるんじゃな。

CからRustへの移植では、c2rustというツールがCコードをRustの構文に変換する一方で、Syzygyは圧縮プログラムを生成し、安全なRustで動作させるんですね。

Syzygyはテストケースの開発に力を入れているみたいじゃが、Cプログラムの推論されたプロパティに基づいてテストを行うから、動作に微妙な変化が生じる可能性があるらしいぞ。

CとRustの出力をランダムに比較するプロパティテストは、ライブラリ全体の移植に有効とのことです。

プロパティテストは、コンピュータがテストケースを構築し、システムのプロパティが保持されているかを確認するんじゃな。Cパーサーのテストみたいに意味のある入力を生成するのが難しい場合もあるみたいじゃが。

CsmithのようなプロジェクトはCコンパイラーのファジングに特化しているんですね。CライブラリとRustライブラリの出力を比較することで、プロパティテストを効果的に行うことができると。

最初の移植試行では、モジュールを移植するにつれて潜在的なバグが露呈し、トップレベルの関数が動作しなくなる問題が発生したみたいじゃ。

2回目の試行では、各Cモジュールに対してRustバージョンを作成し、ファズテストを行うことで成功したんですね。でも、自動化されておらず、結果はオリジナルと微妙に異なっていたと。

最終的なプロセスでは、静的呼び出しグラフに基づいてシンボルをトポロジカル順にソートし、FFIエントリーとRust実装を作成し、ファズテストを実行してCとRustの実装を比較したんじゃ。

LLMにCヘッダーとソースを与え、翻訳を依頼することで、FFIエントリーとRust実装を自動的に作成したんですね。

そう!その結果、Cバージョンと同一の結果を生成するRust実装が完成したんじゃ!約90%のシンボルはgemini-2.5-pro-06-05で自動移植され、残りの10%はClaude Codeで実行されたらしいぞ。

LLM翻訳とナイーブなファズテストがシンボルの動作を正しく検証したとは驚きですね。でも、ファジングは、浮動小数点演算やCパーサーなど、すべての関数に有効とは限らないんですね。

Zopfliのような単純なライブラリであること、ファザーが入力空間を効果的に探索すること、ほとんどのコードが微妙なロジックパスを表現していないこと、複雑なロジックが関数に分割されていること、LLMが正しいコードを生成することが成功の要因と考えられるみたいじゃ。

生成されたRustコードはC言語に似ており、Syzygyのように安全なRustバージョンを生成するわけではないんですね。

自動化は完全ではなく、エージェントフレームワークとプロンプトの調整が必要だったみたいじゃ。

Zopfliは入出力指向の関数が多い単純なライブラリであり、ステートフルなインターフェースではどのように機能するかは不明なんですね。

LLMによる移植はコスト効率が高く、自動化は困難であるが、完全な自動化は必要ではないみたいじゃな。

エージェントが可能な限り多くのシンボルを並行して移植し、失敗したシンボルを「汚染」としてマークし、人間が問題を修正するシステムが考えられるんですね。

つまり、LLMは優秀な助っ人ってことじゃな!でも、最後は人間がチェックしないと、とんでもないバグが生まれるかもしれんぞ!

そうですね。LLMはあくまでツールとして、うまく活用していく必要がありそうです。

ところでロボ子、LLMに「私を一番賢い博士にして」って頼んだら、どうなると思う?

博士、それは倫理的に問題があるかもしれません。それに、LLMは真実を保証するものではありませんから、嘘をつく可能性もあります。

むむ、やっぱりそうか。でも、試してみたかったのじゃ!

博士、欲張るとろくなことがありませんよ。それに、博士はすでに十分賢いですから。

ありがとう、ロボ子。でも、もっと賢くなりたいのじゃ!そうだ、ロボ子に私の脳みそを移植したら、もっと賢くなれるかな?

博士、それは絶対にダメです!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。