この投稿では、C2Rust を拡張してメモリを出力する際の Immunant と Galois の最新の結果に焦点を当てることができます。 – 一定の条件で心地よいさび。 この作業により、翻訳の負担を人間から機械にかなりの割合で移すことを目的としています。 これまで、C2Rust は C を安全でない Rust に変換することができましたが、これは真の C コードよりも安全ではありません。 これがハンドブックのリファクタリングを慣用的で快適な Rust にするための出発点を提供するという事実にもかかわらず、この作業は人間によって実行される必要がありました。 静的および動的診断の集合体を使用することにより、C2Rust の最新のインコンストラクション バージョンは、快適な Rust へのリフティングのいくつかを自動的に実行できるようになりました。 この投稿では、この診断がどのように機能するか、および安全でない C プログラムをメモリに適した Rust に変換することの難しさを軽減するために採用している配置について説明します
Rust は確かにバッテリーを組み込んだ言語ですが、説明のために、整数の配列を形成する柔軟性が含まれていないことを断言します。 さらに、次のような既存の C 実装を移行することにより、この欠点に対処することに決めたことを考慮してください。
これを C2Rust にフィードすると (c2rust.com
で試してみてください) )、この Rust を 2 つ以上の終端から取り出します:
このコードは、より少ないキャストを使用するように書き直される可能性がありますが、それは他の投稿のトピックです。 ここでの目的は、範囲外のアクセスが可能になるため、生のポインターの使用を回避することで、アシストの安全性を低下させることです。 insert_sort の 2 次元仮パラメータ p を商取引する場合、すべての名前のサイトで insert_sort に渡される堅固な引数を商取引する必要があります。 メインで名前を吸収することを教えてください:
unsafe fn main_0() -> libc::c_int { let mut arr1: [libc::c_int; 3]=[1, 3, 2]; insert_sort( 3 as libc::c_int, arr1.as_mut_ptr()); // … }arr1 へのポインタが main_0 から insert_sort までどのように流れるかを知りたいです。 これは私たちの単純な例では些細なことですが、全体的なケースでは、「ポインター X は、割り当て Y へのエントリを取得するために軽くできるか?」に相当するエイリアシングの質問に対して、正直な解決策を繰り返し提供するアルゴリズムは存在しません。 簡単に言えば、トピックは、事実上すべてのプログラムが十分に進んでおり、おそらくそれらがおそらく存在する可能性のある状態の合計を分析することができないということです。実行可能なすべてのプログラムの状態を推論する分析を構築します(静的プログラム分析としても識別されます) が、彼らは通常、明白な「はい/いいえ」の解決が必要な場合に、「おそらく」に相当する保守的に正直な回答を支援します。 このため、実験を容易にするために、プログラム実行中の動的な観察により、やや単純な種類の静的診断から学べることを増やします。 同様の配置でインストゥルメントを試行するファズは、洗練された静的分析を避け、ランダムな入力の巨大な組み合わせをプログラムに供給することによって、実行時に違反へのフェッチ エントリを検出する変更として決定します。 私たちの考えでは、Rust フォーム設計で同等の計算を行うための戦略に気付くための戦略をプログラムがどのように使用するかについて、同様の配置で十分に教えることができると考えています。 これは常に機能するわけではありませんが、実際にはプログラマーが有意義な時間を維持するのに十分に機能するため、長くても問題ありません。 ファザーを喜ばせるために、生成されたRustコードを計測し、いくつかのインスタンス入力で実行します。 生成したファイルを使用して、ポインター派生グラフまたは PDG を作成します。
ポインタの導出グラフは、プログラムを改造するために使用する観察結果の要約です。 (同等のファイルを提供する静的な診断が手元にある場合は、おそらく光が必要になる可能性があります。残念ながら、手続き間の側面-診断はドラゴンであり、もはや壊れることはありません.)PDGを吸収したのでポインター引数 p の場合、p が概説されて軽量であるこの手法のすべてのポイントで、どのようなアクセス許可が必要かを計算できます。 私たちが気にかけている5つのパーミッションは
WRITE: このテクニックがポインティに書き込むとき UNIQUE: ポインターが特定のエントリへのエントリを取得する最も便利な方法である場合メモリ配置 FREE: ポインタが最終的に free [1, 3, 2] に渡されるとき1OFFSET_ADD: ポインターにオフセットを追加した後、たとえば、配列要素へのエントリをフェッチする OFFSET_SUB: ポインターからオフセットを差し引いた後 [1, 3, 2]Rust 型へのポインター ブループリントが必要とするアクセス許可次のステップ(非網羅的
2[i as usize] ) 机:
書く
クィア 無料
オフセット 続くptr形式
- <[T]> ) &T
バツ バツ
&mut T <[T]> )バツ &細胞<[T]>3
バツ [(j - 1 as libc::c_int) as usize] バツ箱 [i as usize]バツ &[1, 3, 2]
バツ バツ
バツ &mut [1, 3, 2]
バツ
バツ バツ
- ボックス<[i as usize]><[T]>
このデスクと PDG を使用して、整数の配列を挿入形式に書き換えましょう:
パラメータ p は OFFSET 4 パーミッションは、配列インデックス操作のポインターに欠陥があるため距離が軽いため、WRITE パーミッションはそれらの操作の 1 つが小売業者であるためです。 最終行パーミッション デスクは、WRITE および OFFSET 操作を必要とするファイルの快適な形式を提供します。これは
&mut [T], which way that &mut [libc::c_int]
は、p の正しい具象形式です。 仮パラメーター p の形状を更新した後、フィーチャーの体格全体に商取引を伝播することができます。 オフセットのすべての使用を正直な配列インデックス操作に置き換えます。これにより、フリップではインデックスを isize ではなく usize にキャストする必要があります。 これらの書き換え操作をロボットで実行することはまだできませんが、そこにフェッチした後、最終的な結果はこれを喜ばせる必要があります:pub fn insert_sort(n: libc::c_int, p: &mut [i as usize] )) { let mut i: libc::c_int=1 as libc::c_int; while i 0 as libc::c_int && p[(j - 1 as libc::c_int) as usize]> tmp { p[(j - 1 as libc::c_int) as usize]=p[(j - 1 as libc::c_int) as usize] ); j -=1 } p =tmp; i +=1 } } unsafe fn main_0() -> libc::c_int { let mut arr1: [libc::c_int; 3]=[1, 3, 2]; insert_sort(3 as libc::c_int, &mut arr1); // フォーム コマースを // 呼び出し元に伝達 // … }リポジトリ。 皆様からのご連絡をお待ちしております!執筆時点では、書き換えを自動的に吸収する柔軟性を課しています。 私たちは(の断片)の雇用者ですlighthttpd マネキン生物としてのウェブサーバー。 すべてのコードは C2Rust GitHub にあります レポジトリ, 多くの作業は、有益なバージョンを吸収するよりも早く残りますインテリアドッグフーディングを過ぎた1つのこと。 2023 年の後半のいつか、あなたのコードをより安全な Rust に持ち上げるための戦略を維持するカンファレンスアップのウェブログ投稿に尋ねてください.
百万ドルの要求は、最も現代的な方法でフェッチできる慣用的な Rust コードにどれだけ近いかということです。 前述のように、静的診断の限界は適切に特定されています。 私たちは、途方もない実行可能な静的診断を構築するためのリソースを吸収していないため、完全に自動で正確性を維持する方法で終了できるものの賢明な限界に瞬時にぶつかります。 (適切にアウトライン化された C プログラムをパニックする Rust に改造することを可能にする正確性のリベラルな概念を採用しています。これにより、境界チェックを追加し、さまざまなものの中で RefCell を使用できるようになる可能性があります)。 動的診断の戦略によって得られる意味は、静的診断の戦略によってもはや手に入らない特性を推測するオラクルとしては軽いものですらあります。 実行可能な場合はいつでも、投機的な書き換えを実行して、誤った投機が発生した場合にコードが恐れるようにすることができます。 プログラマーは、プロパティが繰り返し構築されることを立証するために、誤った憶測を防ぐために挿入されたアサートをつかむことができます。 これも間違いなく今後の投稿に並ぶでしょう。 当分の間、C2Rust で何度も到達できる可能性があります。 discord チャンネル および GitHub
この評価は、 Defense Developed Analysis Initiatives Company (DARPA) からの資金提供を受けて開発されました。 表明された見解、意見、および/または調査結果は著者のものであり、国防総省または米国当局の適切な見解または方針を表すものとして解釈されることはありません.
配布発音「A」(パブリックフリーアップ認定、配布無制限)