コンパイラ、アセンブラ、マシン命令などのようなコンピュータプログラミングの下位コンポーネントに問題がないことをどのように確認できますか?


57

私たちは日々の生活の非常に重要なタスクを含め、コンピューティングにますます頼るようになっているので、私はそれらの重要なコンポーネントがどのようにテストされるのかと思っていました。

より技術的には、コンパイラとアセンブラはどのようにテストされますか?(これは停止の問題に関連すると思います!!)


36
あなたは「ハックケン・トンプソン」を参照してくださいとあなたの研究を開始したいかもしれません信頼する信託の反省
ブライアンオークリーを

7
正確性の証明があるコンパイラの例を次に示します。compcert.inria.fr
Giorgio

8
ほとんどのコンパイラ/リンカー/アセンブラは、さまざまな状況で多く使用することで最も深くテストされています。エラーを見つけるには、何百万人ものユーザーがコンパイラを使用している以上のことはありません。
バートヴァンインゲンシェナウ

3
また、オペレーティングシステムをリストに追加します。
エリックエイド

回答:


104

確信は持てませんが、そうではないとわかるまでは、そうであると仮定するだけです。長年にわたり、コンパイラとハードウェアには多くのバグがありました。

コンパイラなどのこれらのテスト方法は、非常に狭く厳密に定義され、慎重に記述された後、膨大なテストスイートでテストされ、正確性が検証されます。さらに、コンパイラの幅広いユーザーベースを追加すると、より多くのバグが検出および報告されます。歯科医の予約スケジューリングアプリは、比較的少ないユーザーで、欠陥を検出できるユーザーはまだ少ないです。

SQLiteは約73k行のコードで構成されていますが、テストスイートは約91378k行のコードで構成されており、SQLite自体の1250倍以上のコードです。コンパイラーと他のコアツールには同じような比率があると思います。現在のプロセッサは、基本的にVerilogやVHDLなどのハードウェア記述言語を使用してソフトウェアで設計されており、ソフトウェアテストも実行されます。また、製造時点でセルフテストを実行するための専用IOピンもあります。

最終的には確率ゲームであり、テストを繰り返し幅広くカバーすることで、他のソフトウェアプロジェクトと同じように、欠陥の可能性を許容できる低いレベルまで下げることができます。


7
私はしばしばOPと同じ質問を疑問に思っていますが、DBMSに関してです。SQLiteのコンテキスト内でそれに答える素晴らしい例を挙げました。ありがとうございました!
ブランドン

7
+1ですが、どういうわけか「コンパイラと他のコアツールには同じような比率がある」とは思えません。
Mehrdad

5
(1)SQLiteには実際には2つのテストスイートがあり、2つの間に重要な冗長性があり、(2)それでもSQLiteにはバグが見つかっています。
マチューM.

7
SQLiteは、多くのコンパイラよりも一般的な用途で使用可能な(テストコードの行/操作コードの行に関して)最も「広範囲にテストされた」ソフトウェアの1つであるという印象を受けました。ほかに何もなければ、フル機能のコンパイラーは膨大なソフトウェアであり、テストコードの数千倍の量があるとは想像できません。(GCC 14.5万行まで伝えていることは、適切なコンパイラコレクションのどちらかが唯一の14K LOCであること、または、彼らは14億行のテスト・コードベースが側に座っているとは考えにくい:-P。!)
デヴィッド・Z

2
@DavidZ:それは、確かに、たとえば大規模なOOMテストを使用することを知っている唯一のプロジェクトです(テストにフォールトインジェクターを使用し、1回目、2回目の割り当てで繰り返し失敗します...テスト全体まで実行されます)。
マチューM.

46

素人の言葉で:

  1. できません。
  2. コンパイラーおよびインタープリターは、他の(プロフェッショナル)ソフトウェアと同様に単体テストされます。
  3. テストが成功したということは、プログラムにバグがないということではなく、バグが検出されなかったことを意味するだけです。
  4. 長い間コンパイラを使用している幅広いユーザーベースは、ほとんどの場合バグがほとんどないことを示すかなりの指標です。ユーザーは通常、デザイナーが考えていないテストケースだからです。
  5. オープンソースであることも良い指標です。「十分な目を与えられて、すべてのバグは浅いです。十分な大きさのベータテスターと共同開発者ベースを考えると、ほとんどすべての問題はすぐに特徴付けられ、修正は誰かに明白になります。」。クローズドソースコンパイラには、非常に特定の時間に発生するバグや、最適ではないマシンコードを生成するバグが存在する可能性があり、その背後にある会社は、単にその存在を開示せず、製品のロードマップで非常に低い優先度を与える可能性があります

結論:

OOP(O ld、Oペン、P opular)に行きましょう。その頭字語を作りました。


19
+1別のTLA(3文字の頭字語)を発明するために-世界にはまだ十分なものがありません。
s1lv3r

34
また、OOPはコンピュータープログラミングではまだ意味がありませんでした。KTT(kudos to thee)です!
ピエールアラード

15
ピエールのコメントは冗談です@Dannnno。
ヤニス

19
または、P opular、O ld、およびO pen にすることもできます。;)実際、それは私がそれらを重要度順にランク付けする方法です。
jpmc26

23
@ jpmc26 Practical、Old、Open、Popularに行きます。頭字語については...
StupidOne

24

それはずっと亀です。

何も確かではありません。あなたは自信の評価に落ち着かなければなりません。

スタックと考えることができます:数学>物理学>ハードウェア>ファームウェア>オペレーティングシステム>アセンブラー/コンパイラーなど

各レベルには、自信評価を改善するために実行できるテストがあります。これらのテストの一部は形式的な証明の品質を持ち、一部は観察に基づいており、ほとんどは両方の組み合わせです。

これらのテストの一部で再帰を解くのは難しいことです。なぜなら、今ではプログラムを使用して証明や観察分析を行うためです。

最終的には、答えは考えられるすべてを試すことです。静的分析、ファジング、シミュレーション、意図的に選択された極端な入力またはランダム入力での実行、すべての制御パスの実行/マッピング、形式的な証明など。チップ/プログラム)は意図したとおりに動作しません。真剣に努力しても失敗する場合は、製品の正確性に対する信頼性を向上させることができます。

テストはせいぜい半決定的なプロセスであり、最終的にはバグが見つかることを考えますが、すべてを見つけたとは限りません。正式に検証されたソフトウェアを使用している場合でも、物理学、正式な証明を行うために使用されるツール、プログラムが(多くの場合主観的に)「意図した」ことを実行するために必要で十分であることを証明しています。それはあなたが使用している他のすべてのコンポーネントが正式な証拠を持っていないことは言うまでもありません。


17

これは、コードの代わりにツールを非難し始めるという点で、新しい開発者にとって「危険な」質問です(そこにいる、それをしている、あまりにも多くの人がそれをしているのを見た)。コンパイラー、ランタイム環境、OSなどにバグがありますが、開発者は現実的であり、証拠と単体テストがない限り、バグはコードにあることを覚えておく必要があります

主にC、C ++、およびJavaでのプログラミングの25年以上で私は見つけました

  • コンパイラのバグによる2つのバグ(gccおよびSunOS C)
  • 約1年に1回または2回Java JVMの問題によるバグ(通常はメモリ消費/ガベージコレクションに関連)
  • 約1か月に1回または2回、ライブラリのバグ。最新バージョンを使用するか、以前のバージョンのライブラリに戻すことで頻繁に修正されます。

他のすべてのバグはバグに直接関連しているか、より頻繁に、ライブラリがどのように機能するかの理解の欠如に関連しています。バグと思われるものは、非互換性が原因である場合があります。たとえば、Javaクラス構造がどのように変更されて一部のAOPライブラリが破損したかなどです。


私は興味があります-どの言語で何年ですか?戻るC ++コンパイラのバグが...見つけるのはとても難しいなかった、適切に標準化された前EGCSの日
チャールズ・ダフィー

3
コンパイラ、CPU、または言語があいまいになればなるほど、コンパイラのバグを見つける(他の誰かの前に)ので、GCC Cで2を見つけるのは良いことです:)
Surt

1
たまたま、gdbスクリプトに問題があったことや、調べていることを理解したことを推測して、1か月ほど無駄になりました。最終的に、疑わしくなり、テストケースを単純化し、ライブラリ(libkvm)の設計上の欠陥を発見したため、カーネルデバッガーがコアダンプから特定のアドレスにアクセスできなくなりました。つまり、YMMV-そして、上流のコードに新しいバグ、特に開発ではなく使用しているものを見つけたとき、私は一番幸せです。
アーリースティーブンス

もちろん、これはコンパイラのバグではなく、一般的に使用されるライブラリの1つでもありませんでした。そして真実を言うと、私はそれらのバグを見つける頻度はまったくありません。
アーリースティーブンス

@ArlieStephensそこに教訓があります。テストケースを単純化することは、問題を見つけることに失敗したときに早い段階で行うべきことです。問題があなたのものであるか他のコードのものであるかに関係なく、それはあなたがそれを絞り込むのを助けるでしょう。多くの場合、問題が他のコードにある場合、これは「証拠と単体テストの実証」になります。
jpmc26

8

ここで興味深い点は、大多数の商用ソフトウェア(および実際にはオープンソースソフトウェア)ライセンスが、ソフトウェアを信頼できないことを明確に指定していることです。

本ソフトウェアは、商品性、特定の目的への適合性、および非侵害の保証を含むが、これに限らず、明示または黙示を問わず、いかなる種類の保証もなしに「現状のまま」提供されます。

Microsoft Wordライセンス契約から

。限定保証および適用法で許可される最大限の範囲を除き、マイクロソフトおよびそのサプライヤーは、ソフトウェアおよびサポートサービス(存在する場合)を現状のままおよびすべての障害とともに提供し、明示的、黙示的、または商法、特定の目的への適合性、信頼性または可用性、応答の正確性または完全性、結果、職人的な努力の黙示の保証、義務または条件を含むがこれらに限定されない法定ソフトウェアに関するすべてのウイルスの欠如、および過失の欠如、およびソフトウェアを介したサポートまたはその他のサービス、情報、ソフトウェア、および関連コンテンツの提供または提供の失敗、またはソフトウェアの使用から生じる。

基本的に、使用するほとんどすべてのソフトウェアのライセンスに含まれるこの文は、使用するコンパイラはもちろんのこと、ソフトウェアを信頼できないことを具体的に示しています。

ソフトウェアは科学理論のようなものであり、機能しないまで仕様どおりに機能すると見なされます。


ライセンスが完璧なソフトウェアはないと述べていることを指摘したことに対して+1。
Tulainsコルドバ

3
IBMのViaVoice for Macでこの慣行から逸脱していることに注目して、私は満足しました。慣習的な「うまくいかない場合、ひどい」の代わりに、彼らは実際に「ソフトウェアは指定されたとおりに動作することが保証されている」などのことを言った。
WGroleau

1
この特定の保証フレーズの平易な翻訳は、「これはソフトウェアの一部であるか、sh * tの一部である可能性があります。動作する可能性があります。動作しない可能性があります。あなたがやりたいことをやります、他の誰かから盗まれたかもしれません。残念です。私たちはあなたのお金を持ち、それを多くの弁護士を雇うために使いました。 -nyah-nyah-nyaaah-naah!」。:-)
ボブジャービス

2
@BobJarvis:いくつかのオープンソースソフトウェア(nmap IIRCなど)で使用されている私のお気に入りの保証声明は、「破損した場合、両方の部品を保持できる」というものです。
ピーターコーデス

この声明は、オープンソースソフトウェア、および多くの無償のクローズドソースソフトウェアに広く見られます。ほとんどの商用有料ソフトウェアライセンスには表示されません。
jwg

2

数学言語*のコンパイラライターとして、私の経験から、理論的にはできないと言えます。そして、いくつかのバグは、(私の恥ずべきリスト6/3*2から)右から計算し、6/(3*2)クラッシュしたり無意味なコンパイルエラーを出さずに1を出力したりするような間違った結果を与えます。

しかし、私見の多くのコンパイラには、他のソフトウェアほど多くのバグがありません。

  • 単体テストの作成は簡単です。各ステートメントはユニットであり、次のような簡単なテストを作成できます。test_unit("2+(-2)*(-2+1)*3+1",9);
  • プログラムはステートメントの組み合わせであり、プログラムが正しい結果を出力するためには、個々のステートメントが正しい結果を(ほとんど)提供する必要があります。そのため、プログラムが正しい結果を提供している間にバグが発生することはほとんどありません。
  • 書かれたプログラムのサイズと数が増加するにつれて、バグをキャッチする可能性が劇的に増加します。

アセンブラー、機械命令などについては、上記も当てはまります。一方、チップの設計と製造における検証と検証は、巨大なビジネスであるため、はるかに厳格なプロセスです:電子設計自動化

各バグは数百万ドル近くかかるため、生産に移る前に各CPUを厳密にテストする必要があります。チップの生産には莫大な非経常的な生産コストがあります。そのため、企業は、Pentium FDIVバグなど、100%の保証を提供するものではありませんが、生産に移る前に設計に多くのお金を費やし、多くのシミュレーションコードを記述します。

要するに、コンパイラ、マシンコードなどに深刻なバグがあることはほとんどありません。

私の謙虚な数学言語 *


インテルは、ランダムな命令のシーケンスを実行し、ソフトウェアモデルと比較することにより、CPUから地獄をテストします。特に、tweakers.net / reviews / 740/4 / …を使用します。これが、通常とは異なるモードでの指示の組み合わせが非常にまれであるために、本当にあいまいなエラッタが頻繁に公開される理由です。
ピーターコーデス

0

完璧ですか?そうではありません。最近、いくつかの「更新」をインストールしましたが、ASP.NETサイトが再び正常に機能するまでに数か月(およびコードのいくつかの再プログラムされたセクション)がありました。

ただし、それらはテストされてから、ほとんどのことに気付き、報告し、修正する傾向のある多くの非常に賢いディテール指向の人々によって使用されます。Stack Exchangeは、これらのツールを使用するすべての人が、少なくとも実際の使用に関しては、これらの驚くほど複雑で低レベルのツールがどのように機能するかをテストおよび分析するのに役立つ素晴らしい例(および改善)です。

しかし、完璧です。Stack Exchangeのユーザーがパフォーマンスの詳細や標準への準拠と奇抜さに関する印象的な洞察を得ているのを見ることができますが、特にさまざまな人々が欠陥とは異なる意見を持っている場合、常に欠陥と欠陥があります。


-1

基礎となるシステムに問題がないことを示すために、

a)完璧であることを証明する必要がある

  1. 数学的証明
  2. 些細なプログラムでのみ現実的に可能

b)完全なテストを行う

  1. 些細なプログラムといくつかの単純なプログラムでのみ可能
  2. タイミング要素がテストに入ると、時間を無期限に分割できるため、網羅的なテストを実行することはできません。
  3. 些細なプログラムを超えて、可能な実行オプションは指数関数的に爆発します。

ソフトウェアテストでは、徹底的なテストはいくつかの単純な機能の単体テストでのみ使用されます。

例:いくつかのフィールドへの8文字のutf-8入力をテストする場合、バイトでutf-8の最大長6の8倍で入力をカットすることを選択します。これにより、8 * 6 = 48バイトが実際に有限の可能性。

これで、8文字のそれぞれの1,112,064個の有効なコードポイントのみをテストする必要があると考えることができます。1,112,064 ^ 8(たとえば10 ^ 48)テスト(既に可能性は低い)ですが、実際には各48バイトの各値、またはチェスと同じ複雑さである10 ^ 120前後の256 ^ 48をテストする必要がありますおよそ10 ^ 80の宇宙の原子の総数と比較して。

代わりに、努力の昇順で使用することができ、各テストは以前のすべてをカバーする必要があります:

a)良いサンプルと悪いサンプルをテストします。

b)コードカバレッジ。コードのすべての行をテストしてみてください。ほとんどのコードでは比較的簡単です。これで、テストできないコードの最後の1%が...バグ、デッドコード、ハードウェア例外などにあるのではないかと思います。

c)パスカバレッジ、すべての組み合わせのすべてのブランチのすべての結果がテストされます。関数に10を超える条件が含まれている場合に、テスト部門があなたを嫌う理由がわかりました。また、最後の1%をテストできない理由も疑問に思います。一部のブランチは以前のブランチに依存しています。

d)データテスト、境界値、一般的な問題のある値およびマジックナンバー、ゼロ、-1、1、最小+/- 1、最大+/- 1、42、rnd値で多数のサンプルをテストします。これでパスカバレッジが得られない場合は、分析ですべての値を把握していないことがわかります。

すでにこれを行っている場合は、ISTQB基礎試験の準備ができているはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.