プログラムの呼び出しをインターセプトする C リンケージ関数を作成したいのLD_PRELOAD
ですが、Rust でインターセプト関数を実装しています。
呼び出しを傍受するための を作成するのに問題はありませんpub extern fn
が、メタデータを受け入れるために傍受している関数の署名を変更できないため、プログラムのグローバル状態からどこかで読み書きしたいと思います。ヒープ割り当ては必ずしも必要ではありません。HashSet
またはVec
エントリの静的に初期化された大規模なプールを使用できます。ただし、プログラムの実行中にコレクションの要素を追加および削除できる必要があります。
このパターンが多くの Rust 設計目標に反していることは認識していますが、それでも私には正当な使用例のように思えます。
私はRustが初めてなので、これをunsafe
行うオプションがあることを願っています。
コード例を見ると便利な場合:
static mut foo Vec<c_int> = Vec::new();
static
...デストラクタを必要とする、またはヒープ割り当てを行うストレージを使用できないため、失敗します。そして、有能な構造lazy_static!
を許可しません。mut
理想的には、HashSet<c_int>
. それがうまくいかない場合は、 を試すことができると思いますVec::from_elem(100, 0)
。ある種の歩哨値を指定する必要があるため、これは理想的ではありませんが、機能する場合は満足できると思います.