EN JP CN

PORTING.MACRO.NUMTYPE

PORTING.MACRO.NUMTYPE

組み込み数値型を記述するマクロ

PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.MACRO.NUMTYPE チェッカーは、組み込み数値型を記述するマクロが使用されている状況を検出します。

脆弱性とリスク

通常、コンパイラは、特定のデータモデルや機能に対して "courtesy" 数値制限 (limits.h で一般的) を提供します。ただし、別のコンパイラにより提供される制限が異なる可能性があるだけでなく、幅 (ビット単位表現) がまったく異なる可能性があるため、プラットフォーム間でこれらの値を使用することはお勧めできません。これらの値を使用すると、スタックオーバーフロー、数値のオーバーフロー/アンダーフロー、処理ランタイムコストの枯渇など多くの問題が発生します。

軽減と防止

特定のプラットフォームのコンパイラで提供される抽象数値に依存せず、どのように処理をするか正確に理解できるように独自の制限を定義します。

脆弱コード例


1   extern void do_something_that_takes_a_while();

2   void foo()
3   {
4      for( int i = 0; i < INT_MAX; i++ )
5        do_something_that_takes_a_while();
5   }

2 つのプラットフォーム (たとえば、16 ビットと 32 ビット) 間でこのコードを移行すると、この関数の処理コストは指数関数的に増加する可能性があります。

修正コード例

1   #define MAX_OPS 65535

2   extern void do_something_that_takes_a_while();

3   void foo()
4   {
5      for( int i = 0; i < MAX_OPS; i++ )
6        do_something_that_takes_a_while();
7   }

このコードは独自の制限を定義するので、プラットフォーム間のどのような移行にも関係なく、必ず同じ数値が使用されます。