コード外でシード実行可能ランダム化

コード外でシード実行可能ランダム化

私たちは、一部のサードパーティの既存のソフトウェアに対してコードを実行する機能テストフレームワークを構築しました。この作業を定期的に実行し、結果を予想結果と比較します(単位テストと同じですが、テスト自体は単体テストよりも複雑です)。

サードパーティが使用するソフトウェアは、プリコンパイルされた実行可能ファイル(実際にはMoveIt(ROSロボットフレームワーク内)とCoppelia Sim(ロボットシミュレータ)という2つの実行可能ファイルがあります)であり、最も確実にC ++でコード化されています。これらの詳細は本当に重要だとは思わない。結果を比較し続けたいので、プリコンパイルされた実行ファイルが乱数生成を使用しても、テストフレームワークの出力は決定的である必要があります。

サードパーティの実行可能ファイルの乱数ジェネレータで決定論的な結果を得るには、外部から実行可能ファイルをシードする方法を探しています(つまり、完全なアクセス権を持たないコードではありません)。私はほとんどの乱数生成がコンピュータクロックに基づいてシードされることを知っているので、私は考えました。実行可能ファイルがコンピュータとは異なる時計で実行されていると信じるように欺くことができる場合は、実際にはこれらの実行可能ファイルを外部にシードできます。

どう思いますか?コードの外で実行可能ファイルを植えるというアイデアはありますか?

注:私たちは実際にMoveItのソースコードにアクセスすることができ、それを再コンパイルすることができます(しかし、重くて未知のコードベースを決定的な動作に変えることはかなり重くて難しい作業にもかかわらず)、ソースコードにアクセスすることはできません。 CoppeliaSimコード - したがって、再コンパイルできません(したがってコードからシードできません)。

答え1

固定時計を使用する必要があるように聞こえます。システム時計(壁時計)の代わりにCPUから値を取得する単調時計で実行されるコードを使用していることを願っています。

これをテストする非常に簡単な方法は、次の手順を実行するbashスクリプトを書くことです。

  1. システムクロックの設定
  2. ソフトウェアの実行

何度か試してみて、どうなるかを見てください。スクリプトを実行するたびに結果を一致させることができれば、実行可能で非常に単純なソリューションを得ることができます。何らかの理由で開発者がミリ秒単位の値で構築することを決定した場合、幸運ではないかもしれません。

スクリプトは次のとおりです。

#! /bin/bash
date --set="8 FEB 2021 10:00:00"
./your-program-here

関連情報