メインコンテンツ

CWE Rule 192

Integer Coercion Error

R2023a 以降

説明

ルールの説明

Integer coercion refers to a set of flaws pertaining to the type casting, extension, or truncation of primitive data types.

Polyspace 実装

ルール チェッカーは以下の問題をチェックします。

  • 整数変換のオーバーフロー

  • 符号変化する整数の変換のオーバーフロー

  • 汚染された符号変化の変換

  • 符号なし整数の変換のオーバーフロー

すべて展開する

問題

この問題は、整数がより小さい整数型に変換された場合に発生します。変数に元の値を表現するだけの十分なバイト数がない場合、変換はオーバーフローします。たとえば、処理系定義の time_t 型と符号付き整数の比較を実行すると、time_t が符号なし整数として実装されている可能性があるため、Polyspace® は違反を報告します。

異なる浮動小数点型への正確なストレージ割り当てはプロセッサに依存します。ターゲット プロセッサ タイプ (-target)を参照してください。

リスク

整数変換のオーバーフローにより、未定義の動作が発生します。

修正方法

修正方法は欠陥の根本原因によって異なります。多くの場合、結果の詳細 (または Polyspace as You Code のソース コード ツールヒント) には欠陥につながる一連のイベントが表示されます。そのシーケンス内のどのイベントについても修正を実装できます。結果の詳細にイベント履歴が表示されない場合は、ソース コード内で右クリック オプションを使用して、欠陥に関連する変数のこれまでの参照を検索し、関連するイベントを検出できます。Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈またはPolyspace Access Web インターフェイスでの Bug Finder の結果の解釈 (Polyspace Access)も参照してください。

この欠陥は次のようにして修正できます。

  • すべての値に適応できるように、変換の結果に対してより大きいデータ型を使用。

  • オーバーフローにつながる値をチェックし、適切なエラー処理を実行。

一般的に、より小さい整数型への変換は避けます。

以下の修正例を参照してください。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

チェッカーの拡張

入力値が不明であり、入力のサブセットのみがエラーの原因となっている場合、既定の Bug Finder 解析ではこの欠陥が報告されない可能性があります。特定のシステム入力値を原因とする欠陥の有無をチェックするには、より厳密な Bug Finder 解析を実行してください。特定のシステム入力値から欠陥を見つけるための Bug Finder チェッカーの拡張を参照してください。

例 — int から char への変換
char convert(void) {

    int num = 1000000;

    return (char)num;  //Noncompliant
}

return ステートメントで、整数変数 numchar に変換されています。しかし、1000000 を表現するには少なくとも 20 ビットが必要なため、8 ビットまたは 16 ビットの文字では表現できません。そのため、変換演算はオーバーフローします。

修正 — 変換の種類を変更

1 つの修正方法として、数全体を表現できる別の整数型に変換することができます。

long convert(void) {

    int num = 1000000;

    return (long)num;
}
問題

この問題は、符号なし整数が符号付き整数に変換された場合に発生します。変数に、元の定数と符号ビットの両方を表現するだけの十分なバイト数がない場合、変換はオーバーフローします。

異なる浮動小数点型への正確なストレージ割り当てはプロセッサに依存します。ターゲット プロセッサ タイプ (-target)を参照してください。

修正方法

修正方法は欠陥の根本原因によって異なります。多くの場合、結果の詳細 (または Polyspace as You Code のソース コード ツールヒント) には欠陥につながる一連のイベントが表示されます。そのシーケンス内のどのイベントについても修正を実装できます。結果の詳細にイベント履歴が表示されない場合は、ソース コード内で右クリック オプションを使用して、欠陥に関連する変数のこれまでの参照を検索し、関連するイベントを検出できます。Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈またはPolyspace Access Web インターフェイスでの Bug Finder の結果の解釈 (Polyspace Access)も参照してください。

以下の修正例を参照してください。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

チェッカーの拡張

入力値が不明であり、入力のサブセットのみがエラーの原因となっている場合、既定の Bug Finder 解析ではこの欠陥が報告されない可能性があります。特定のシステム入力値を原因とする欠陥の有無をチェックするには、より厳密な Bug Finder 解析を実行してください。特定のシステム入力値から欠陥を見つけるための Bug Finder チェッカーの拡張を参照してください。

例 — 符号なし char から char への変換
char sign_change(void) {
    unsigned char count = 255;

    return (char)count;  //Noncompliant
}

return ステートメントで、符号なしの文字変数 count が符号付き文字に変換されています。しかし char は 8 ビットであり、1 ビットは定数の符号、7 ビットは数字の表現に使われます。255 は 8 ビットを使用するため、変換演算によりオーバーフローが起きます。

修正 — 変換の種類を変更

1 つの修正方法として、より大きい整数型を使用することができます。int を使用すると、符号と数値を表現する十分なビット数が得られます。

int sign_change(void) {
    unsigned char count = 255;

    return (int)count;
}
問題

この問題は、セキュリティで保護されていないソースからの値が、符号付きの値から符号なしの値に暗黙的または明示的に変換された場合に発生します。

たとえば、size_t を引数として使用する関数では、引数が暗黙的に符号なし整数に変換されます。size_t を暗黙的に変換する関数のいくつかを、以下に挙げます。

bcmp
memcpy
memmove
strncmp
strncpy
calloc
malloc
memalign

リスク

小さい負の数値を符号なしに変換すると、その結果は大きい正の数値となります。大きい正の数値により、セキュリティが脆弱になる可能性があります。たとえば、符号なしの値を以下で使用した場合がこれに該当します。

  • メモリ サイズ ルーチン — メモリ割り当ての問題の原因となります。

  • 文字列操作ルーチン — バッファー オーバーフローの原因となります。

  • ループ境界 — 無限ループの原因となります。

修正方法

符号なしの負の値の変換を避けるため、変換対象の値が許容範囲内にあることを確認します。たとえば、値がサイズを表す場合は、その値が負ではなく値の最大サイズより小さいことを検証します。

チェッカーの拡張

既定では、Polyspace は外部ソースからのデータは汚染されていると仮定します。Polyspace 解析での汚染のソースを参照してください。Polyspace 解析の現在のスコープ以外から発生したすべてのデータを汚染されたものと見なすには、コマンド ライン オプション [-consider-analysis-perimeter-as-trust-boundary] を使用します。

例 — メモリ値をサイズ引数で設定
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};

void bug_taintedsignchange(void) {
    int size;
    scanf("%d",&size);
    char str[SIZE128] = "";
    if (size<SIZE128) {
        memset(str, 'c', size); //Noncompliant
    }
}

この例では、バッファー char が作成され、memset を使用して埋められます。memset のサイズ引数は、関数の入力引数です。

memset を呼び出すことにより、size が符号なし整数へと暗黙的に変換されます。size が大きい負の数値である場合、その絶対値は整数で表現するには大きすぎる可能性があり、バッファー オーバーフローの原因となります。

修正 — size の値をチェック

1 つの修正方法として、size が有効範囲内にあるかどうかをチェックします。この修正では、size がゼロより大きくバッファー サイズより小さいかどうかを、memset を呼び出す前にチェックします。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};

void corrected_taintedsignchange(void) {
    int size;
    scanf("%d",&size);
    char str[SIZE128] = "";
    if (size>0 && size<SIZE128) {
        memset(str, 'c', size);  
    }
}
問題

この問題は、符号なし整数がより小さい符号なし整数型に変換された場合に発生します。変数に元の定数を表現するだけの十分なバイト数がない場合、変換はオーバーフローします。

異なる浮動小数点型への正確なストレージ割り当てはプロセッサに依存します。ターゲット プロセッサ タイプ (-target)を参照してください。

リスク

整数変換のオーバーフローにより、未定義の動作が発生します。

修正方法

修正方法は欠陥の根本原因によって異なります。多くの場合、結果の詳細 (または Polyspace as You Code のソース コード ツールヒント) には欠陥につながる一連のイベントが表示されます。そのシーケンス内のどのイベントについても修正を実装できます。結果の詳細にイベント履歴が表示されない場合は、ソース コード内で右クリック オプションを使用して、欠陥に関連する変数のこれまでの参照を検索し、関連するイベントを検出できます。Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈またはPolyspace Access Web インターフェイスでの Bug Finder の結果の解釈 (Polyspace Access)も参照してください。

この欠陥は次のようにして修正できます。

  • すべての値に適応できるように、変換の結果に対してより大きいデータ型を使用。

  • オーバーフローにつながる値をチェックし、適切なエラー処理を実行。

一般的に、より小さい整数型への変換は避けます。

以下の修正例を参照してください。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

チェッカーの拡張

入力値が不明であり、入力のサブセットのみがエラーの原因となっている場合、既定の Bug Finder 解析ではこの欠陥が報告されない可能性があります。特定のシステム入力値を原因とする欠陥の有無をチェックするには、より厳密な Bug Finder 解析を実行してください。特定のシステム入力値から欠陥を見つけるための Bug Finder チェッカーの拡張を参照してください。

例 — int から char への変換
unsigned char convert(void) {
    unsigned int unum = 1000000U;

    return (unsigned char)unum;  //Noncompliant
}

return ステートメントで、符号なしの整数変数 unum が符号なしの文字タイプに変換されています。しかし、1000000 には少なくとも 20 ビットが必要なため、変換によりオーバーフローが生じます。C プログラミング言語の規格では、最大値に 1 を加えた値を法としてプログラムが結果を自動的に縮小するため、符号なしのオーバーフローはエラーとは見なされません。この例では、文字データ型は 2^8-1 しか表現できないため、unum2^8 を法として縮小されます。

修正 — 変換の種類を変更

1 つの修正方法として、数全体を表現できる別の整数型に変換することができます。たとえば、long です。

unsigned long convert(void) {
    unsigned int unum = 1000000U;

    return (unsigned long)unum;  
}

チェック情報

カテゴリ: Numeric Errors

バージョン履歴

R2023a で導入