ホームページ  >  記事  >  バックエンド開発  >  あなたのC/Cコードは不当な仮定をしていませんか?

あなたのC/Cコードは不当な仮定をしていませんか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-31 04:22:31339ブラウズ

 Is Your C/C   Code Making Unwarranted Assumptions?

C/C における不当な仮定の実証

この教育ツールをどのように改善できますか?

の効果を高めるにはこのツールを使用する場合は、次の提案を検討してください:

  • 条件付きコンパイルを組み込む: 条件付きコンパイルを使用して、特定のプラットフォーム特性に基づいた仮定をテストします。たとえば、テスト プログラムが特定のプラットフォーム依存機能に依存している場合、#ifdef または #if __GNUC__ を使用して、テストをさまざまなコンパイラ環境に合わせて調整できます。
  • テスト ケースを展開します。 プログラマが行うより一般的な仮定をカバーするために、より多様なテスト ケースを含めます。例としては、次のものが挙げられます。

    • 「浮動小数点演算は結合的です」
    • 「void* のサイズは、アドレス指定可能な最小単位のサイズと同じです」
    • "負の数の符号は常に -"
  • テストを自動化する: テストを実行して結果を収集するためのスクリプトまたは自動ツールを作成します。異なるプラットフォーム。これにより、テスト プロセスが合理化され、プラットフォームの違いのデータベースの保守が容易になります。

どのテストが適しており、どのように見えるべきですか?

1.文字の仮定:

  • テスト: すべてのプラットフォームで 'A' == 65 であることを確認します。
  • コード:

    <code class="c">EXPECT("00 we have ASCII",('A'==65));</code>
  • テスト: 'a' < という仮定が成り立つかどうかを確認します。 「A」は有効です。
  • コード:

    <code class="c">EXPECT("02 big letters come before small letters",('A'<'a'));
  • テスト: テストchar のサイズが常に 8 ビットの場合。
  • コード:

    <code class="c">EXPECT("04 a char is 8 bits",CHAR_BIT==8);

2.整数の仮定:

  • テスト: 整数が 2 の補数表現を使用し、ラップアラウンドするという仮定が有効かどうかを調べます。
  • コード:

    <code class="c">EXPECT("06 integers are 2-complement and wrap around",(int_max+1)==(int_min));
  • テスト: int のサイズが a のサイズと同じであるかどうかを確認します。 void* はすべてのプラットフォームで true です。
  • コード:

    <code class="c">EXPECT("05 int has the size of pointers",sizeof(int)==sizeof(void*));

3 。ポインターの仮定:

  • テスト: sizeof(void*) が常に sizeof(void(*)()) 以上であることを確認します。
  • コード:

    <code class="c">EXPECT("10 void* can store function pointers",sizeof(void*)>=sizeof(void(*)()));</li>
    </ul>
    <p><strong>4.実行の仮定:</strong></p>
    <ul>
    <li>
    <strong>テスト:</strong> スタックが常に下方向に成長するかどうかをテストします。</li>
    <li>
    <p><strong>コード:</strong></p>
    <blockquote><pre class="brush:php;toolbar:false"><code class="c">EXPECT("12 the stack grows downwards",check_grow(5,0)<0);</code>
  • テスト: 式の評価は常に左から右であるという仮定を調べます。
  • コード:

    <code class="c">EXPECT("00 we have ASCII",('A'==65));</code>

実際に入手できるプラットフォームでテストを実行して、結果を投稿していただけませんか?

さまざまなプラットフォームでの仮説のテストにコミュニティの参加を奨励します。次の情報とともに結果を共有してください:

  • プラットフォームの詳細 (オペレーティング システム、コンパイラーのバージョン、アーキテクチャ)
  • 予想される結果との相違点
  • 理由違いが発生する可能性があります (例: コンパイラの最適化、プラットフォーム固有の実装)

以上があなたのC/Cコードは不当な仮定をしていませんか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。