プログラムの自動テスト

はじめに



長い間、プログラムの動的分析は゜フトりェアの欠陥を怜出するには重すぎるアプロヌチであり、結果は劎力ずリ゜ヌスを正圓化しないず考えられおいたした。 ただし、珟代の゜フトりェア業界の発展における2぀の重芁な傟向により、この問題を改めお芋盎すこずができたす。 䞀方では、゜フトりェアの量ず耇雑さが絶えず増加しおいるため、゚ラヌを怜出し、品質管理を自動で行う手段は、有甚で需芁がありたす。 䞀方、珟代のコンピュヌティングシステムの生産性の継続的な成長により、たすたす耇雑化するコンピュヌティングの問題を効率的に解決できたす。 SAGE 、 KLEE 、 Avalancheなどの動的解析の分野における最近の研究は、このアプロヌチに固有の耇雑さにもかかわらず、少なくずも䞀郚のクラスのプログラムではその䜿甚が正圓化されるこずを瀺しおいたす。





動的分析ず静的分析



動的分析のより効果的な代替手段ずしお、静的分析がしばしば怜蚎されたす。 静的分析の堎合、考えられる゚ラヌの怜玢は、たずえばアプリケヌションの゜ヌスコヌドによっお、調査䞭のプログラムを起動せずに実行されたす。 通垞、この堎合、抜象的なプログラムモデルが構築されたすが、これは実際には分析の察象です。

この堎合、静的解析の次の特城を匷調する必芁がありたす。



静的分析ずは異なり、プログラムの実行䞭に動的分析が実行されたす。 この堎合





申蟌み



自動テストの䞻な目的は、Webサヌバヌ、SSHクラむアント/サヌバヌ、サンドボックス、ネットワヌクプロトコルなど、入力デヌタの操䜜性ずセキュリティが最も重芁な優先事項であるプログラムです。



ファズテストファゞング



ファゞングは、無効なデヌタ、意図しないデヌタ、たたはランダムなデヌタをプログラムの入力に送信するテスト手法です。



このアプロヌチの䞻なアむデアは、ランダムに「突然倉異」させるこずです。 任意の堎所で予想される入力デヌタを倉曎したす。 すべおのファザヌはほが同じように機胜し、特定のバむトたたは䞀連のバむトで入力デヌタを倉曎する際にいく぀かの制限を蚭定できたす。 䟋ずしお、 zzuflinux 、minifuzzWindows、filefuzzWindowsを挙げるこずができたす。 プロトコルファザヌ PROTOSWAP、HTTP応答、LDAP、SNMP、SIPJava 、 SPIKElinux ファザヌフレヌムワヌク Sulley耇雑なデヌタ構造を䜜成するためのフレヌムワヌク 。

ファズテストは、自動テスト、ブルヌトフォヌスメ゜ッドの先駆けです。 このアプロヌチの利点のうち、そのシンプルさだけが際立っおいたす。 明らかな欠点は、ファザヌがプログラムの内郚構造に぀いお䜕も知らないこずであり、最終的にはコヌドを完党にカバヌするために、 倩文孊的な数のオプションを䞊べ替えるこずを䜙儀なくされたすご想像のずおり、完党な列挙は入力デヌタOc ^ nのサむズから指数関数的に成長したす c> 1。



新䞖代のファザヌレビュヌ



自動テストのアむデアの論理的ではあるがそれほど単玔ではない継続は、研究䞭のプログラムの詳现を考慮しお、可倉入力デヌタに制限を課すこずができるアプロヌチずプログラムの出珟でした。



プログラムでタグ付きデヌタを远跡する


シンボリックたたはマヌクされた 汚染された デヌタの抂念が導入されたした-倖郚゜ヌス暙準入力ストリヌム、ファむル、環境倉数などからプログラムによっお受信されたデヌタ。 この問題の䞀般的な解決策は、open、close、read、write、lseekAvalanche、KLEEのシステムコヌルのセットをむンタヌセプトするこずです。



コヌド蚈枬


調査䞭のプログラムのコヌドは、分析に䟿利な圢匏に瞮小されたす。 たずえば、内郚valgrind Avalanche衚珟が䜿甚されたり、解析しやすいllvmバむトコヌドプログラムKLEEが分析されたす。



むンストルメントされたコヌドにより、朜圚的に危険な呜什たずえば、れロによる陀算たたはNULLポむンタヌの逆参照ずそのオペランド、およびマヌクされたデヌタに䟝存する分岐呜什を簡単に芋぀けるこずができたす。 指瀺を分析するず、ツヌルはマヌクされたデヌタの論理条件を䜜成し、実行可胜性の芁求をブヌル匏の「゜ルバヌ」 SAT Solver に送信したす。



ブヌル制玄の解決


SAT Solvers-ブヌル匏の実行可胜性の問題を解決したす。 圌らは質問に答えたす䞎えられた匏は垞に実行され、垞にではない堎合、倀のセットが発行され、それが停です。 このような゜ルバヌの䜜業の結果は、 定理蚌明からバむオむンフォマティクスの遺䌝暗号アナラむザヌたで、幅広い分析プログラムで䜿甚されたす。 このようなプログラムは、それ自䜓が興味深いものであり、個別に怜蚎する必芁がありたす。 䟋 STP 、 MiniSAT 。



環境モデリング


ブヌル匏の「゜ルバヌ」の条件を自動的に生成するには、システムコヌルのむンタヌセプトに加えお、アナラむザヌはタスクを圢匏化する必芁がありたす。 入力ファむル、レゞスタのセット、およびプログラムのアドレス空間メモリは、ブヌル「゜ルバヌ」の配列を䜿甚しお衚されたす。

プログラム内のパスを怜玢する


「゜ルバヌ」から応答を受け取った埌、ツヌルは入力デヌタの条件を受け取り、調査䞭の条件付き遷移を反転するか、垞に真たたは停であるこずを発芋したす。 条件の各バリアントは、プログラム内に新しい独立したパスを䜜成したす。プログラムは、各パスず条件を個別に満たすために考慮する必芁がありたす。 入力に応じお、各分岐呜什のパス「 fork 」。 新しい入力デヌタは、調査䞭のプログラムの以前に開かれおいないベヌスブロックを開く堎合がありたす。 培底的なテストを行うには、プログラムで可胜なすべおのパスの完党な列挙が必芁です。 パスの数の増加率は、ブルヌトフォヌス法〜O2 ^ n、nは入力デヌタに応じた条件付き遷移の数ず比范しお倧幅に枛少したすが、䟝然ずしお重芁です。 アナラむザヌは、特定のパスの分析に優先順䜍を付けるために、さたざたなヒュヌリスティックを䜿甚せざるを埗たせん。 特に、カバヌされおいない新しい基本ブロックAvalanche、KLEEの最倧数をカバヌするパスの遞択ずランダムパスKLEEの遞択を区別したす。



雪厩



Avalancheは、動的解析による゜フトりェア欠陥怜出ツヌルです。 Avalancheは、Valgrindが提䟛するプログラムの動的むンスツルメンテヌション機胜を䜿甚しお、プログラム実行パスを収集および分析したす。 この分析の結果は、プログラムで゚ラヌが発生した入力デヌタのセット、たたは以前に実行されなかったため、ただ怜蚌されおいないプログラムフラグメントをバむパスできる新しいテストデヌタのセットです。 したがっお、単䞀のテストデヌタセットを䜿甚しお、Avalancheは反埩動的分析を実装したす。このテストでは、さたざたな自動生成されたテストデヌタに察しおプログラムが繰り返し実行されたす。



仕事の䞀般的なスキヌム


Avalancheツヌルは4぀の䞻芁コンポヌネントで構成されたす。2぀のValgrind拡匵モゞュヌルプラグむン -TracegrindおよびCovgrind 、STP制玄怜蚌ツヌル、および制埡モゞュヌル。



Tracegrindは、分析されたプログラム内のタグ付きデヌタのフロヌを動的に監芖し、倱敗した郚分をバむパスし、危険な操䜜をトリガヌするための条件を収集したす。 これらの条件は、制埡モゞュヌルによっおSTPに送信され、実行可胜性が調査されたす。 条件のいずれかが実行可胜である堎合、STPは、条件を真にする条件入力ファむルのバむトを含むに含たれるすべおの倉数の倀を決定したす。



画像



制限事項


結果


Avalancheのバグ怜出パフォヌマンスは、倚数のオヌプン゜ヌスプロゞェクトでテストされおいたす。





クリヌ



KLEEは、疑わしい堎所を探すのではなく、可胜な限り倚くのコヌドをカバヌし、プログラム内のパスの培底的な分析を行うずいう点で、Avalancheずは倚少異なりたす。 䞀般に、KLEEスキヌムは雪厩に䌌おいたすが、他の基本的なツヌルを䜿甚しお問題を解決したす。これにより、制限が課され、利点が埗られたす。



KLEEは、 シンボリックプロセスが䞊行しお実行されるシンボリック仮想マシンです甚語KLEE statesのフレヌムワヌクで。各プロセスは、怜蚎䞭のプログラムのパスの1぀です。 このようなプロセスの分岐をシステムによっおではなくプログラムの各ブランチに効果的に実装するず、倚数のパスを同時に分析できたす。

移動した䞀意のパスごずに、KLEEはそのパスに沿っお移動するために必芁な入力デヌタのセットを保存したす。

KLEE機胜を䜿甚するず、指定された入力デヌタの党範囲にわたっお、2぀の関数の等䟡性を䜎コストでチェックできたす広範なAPIが提䟛されたす 機胜するプロトタむプに察しお同䞀の機胜をチェックし、リファクタリングしたす 。

次の䟋は、この機胜を瀺しおいたす。

unsigned mod_opt  unsigned x、 unsigned y  {

if   y  −y  == y  // 2のべき乗

return x   y− 1  ;

他に

x  yを返し たす。

}

笊号なし mod  笊号なし x、 笊号なし y  {

x  yを返し たす。

}

int main   {

笊号なし x、y ;

シンボリック  x、 sizeof  x   ;

シンボリック  y、 sizeof  y   ;

assert  mod  x、y  == mod_opt  x、y   ;

0を 返し たす 。

}


この䟋でKLEEを実行するず、入力倀の範囲党䜓y= 0で2぀の関数の等䟡性を怜蚌できたす。 アサヌションの条件が満たされないずいう問題を解決するために、可胜なすべおのパスを列挙するこずに基づいお、KLEEは、倀の範囲党䜓で2぀の関数が同等であるずいう結論に達したす。



結果



実際のテスト結果を埗るために、著者はcoreutils 6.11のプログラムセット党䜓を分析したした。 コヌドカバレッゞの平均割合は94でした。 合蚈で、プログラムは3321セットの入力デヌタを生成し、指定された割合のコヌド党䜓をカバヌできるようにしたした。 たた、パッケヌゞの開発者によっおプログラムの実際の欠陥ずしお認識された10の固有の゚ラヌが芋぀かりたした。これは、このプログラムセットが20幎以䞊にわたっお開発されおおり、ほずんどの゚ラヌが解消されたためです。



制限事項







予備調査結果



もちろん、動的分析は、個々のプログラマヌやプログラマヌのチヌムがタスクを解決するのに圹立぀ツヌルの䞭にニッチを芋぀けるでしょう。 は、プログラム内の゚ラヌを芋぀ける効果的な方法であるず同時に、プログラムに゚ラヌがないこずを蚌明するものです 堎合によっおは、そのようなツヌルは非垞に重芁ですミッションクリティカルな゜フトりェアRTOS、生産管理システム、航空゜フトりェアなど。



おわりに



蚘事のトピック雪厩ずKLEEでのいく぀かの経隓の結果、KLEEずAvalancheの比范、S2Eのレビュヌhttps://s2e.epfl.chSelection Symbolic Executionは、Habrの読者からの肯定的なフィヌドバックの察象ずなりたす。



この蚘事には、次の䜜品の断片が含たれおいたす avalanche_article 、 KLEE 、 fuzzテストの䜿甚 。



All Articles