解説論文:コンパイラのファジング

面白そうなものを見つけたので、読んでみました。研究論文ではないので、まとめはありません。気になった箇所を引用します。


>カバレージなどのテスト品質指標を意識したテストをランダムテスト、とにかく不具合を検出することを意識したテストをファジングと呼ぶことが多い

ふーむ、なるほど。「テスト品質」という用語についてもやもやしますが、それは置いておきましょう。ランダムテストとファジングの違いについてですが、僕の感覚とはちょっと違いました。ファジングはセキュリティの文脈でしか聞いたことがないですね。ランダムテストについては29119-4に定義があるので引用してみましょう。

>Random testing shall use a representation of the input domain of the test item that defines the set of all possible input values.

>Test cases for random testing shall be chosen by randomly selecting input values from the input domain of the test item according to the chosen input distribution

入力ドメインを識別し、その中から分布を考慮してテストケースに使う値を選定する、ということですね。ランダムとはいえ、何らかの確率分布(例えば正規分布や一様分布、運用プロファイル)に従った値の選択になるということですね。同値分割の、ある意味仲間ですかね。カバレッジを意識しているかというと、僕はそうは思えません。使いどころとしては、同値分割した後の同値パーティションにおいて、テスト実装時に値を選ぶ際にランダムテストによる値の選択を行う、とか。そうなるとすでに同値パーティションに割っている時点でカバレッジについては保証されているので、ランダムテストによって何か新しくカバレッジが追加されるとは思えないのです。

というわけでランダムテストとファジングの違いはいったい何なのでしょうね。可能性としては、ちゃんと分布を決めているvs決めていない、または、目的の違い、があるかな、と思いました。


>ランダムに生成したプログラムに対して、そのコンパイル・実行結果が正しいことをいかにして判定するか

>未定義動作を含むプログラムの生成をいかにして避けるか

これらがコンパイラのファジングにおける課題、とのことです。前者は一般的ですね。テスト対象の入力を自動生成しても、結果が予測できないと意味がないと。後者はコンパイラ特有ですかね。まぁ禁則を防ぐ、に近いような気がしますが。


>最小化(同じエラーが生じるできるだけ小さなプログラムを求めること)

これは面白いです。通常自動テストでも手動テストでもNGが出ると人間が詳細の調査に入っていわゆる「切り分け」を行うのですが、それをする前にある程度ファジングツールが切り分けてくれるんですって。すごいな。他ドメインのシステムテストでも使えそうなら、是非取り入れたい。


>コンパイラの最適化機能のファジング

品質特性で言うと性能効率性のテスト、ということですね。どうやって閾値を設定するかがわかりませんが。ベンチマーク的に比較ならできると思います。


具体的なソフトウェアテストの自動化の事例という感じがして、とても優良な資料だと思いました。





この記事が気に入ったらサポートをしてみませんか?