EN JP CN

PORTING.CMPSPEC.TYPE.LONGLONG

PORTING.CMPSPEC.TYPE.LONGLONG

'long long' の使用

PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.CMPSPEC.TYPE.LONGLONG チェッカーは 'long long' の使用を検出します。

脆弱性とリスク

このデータ型は、コンパイラ間での一貫性という意味では定義が非常に不完全なため、できるだけ使用しないでください。ほとんどのコンパイラでは、このデータ型の代わりに使用できる抽象データモデルが提供されているため、プログラマーは、たとえば、予期せずに 128 ビットが使用されることなく、64 ビットを使用できます。

軽減と防止

実際に必要なビットサイズを表すためには、'long long' で十分な幅が提供されると仮定せずに、コンパイラの固有のマクロや定義されたマクロを使用します。

脆弱コード例


1   void foo()
2   {
3     long long ll = 0xff00;        // PORTING.CMPSPEC.TYPE.LONGLONG
4   }

この型を使用した場合、コンパイラが 'll' のスタックにどのように空間を予約するかは保証されません。

修正コード例


1   void foo()
2   {
3     UINT64_t l;     // compiler-defined, or data model-provided abstract type of a defined bit width

4       l = 0xff00;
5   }

修正コードを使用すると、コンパイラが 'l' の空間をどのように予約するかを正確に理解できます。コンパイラ間で移動する場合、新しいプラットフォームで使用するための typedef または #define で定義した同様の型を検出できます。