メインコンテンツ

数値にプレーンの char 型が使用されています

符号属性を明示的に指定していない算術演算でのプレーンの char 変数

説明

この欠陥は、明示的な符号属性のない char 変数が次のように使用された場合に発生します。

  • char 定数を格納するため。

  • char が以下の場合の算術演算

    • 負の値。

    • 符号変化のオーバーフローの結果。

  • バッファー オフセットとして

signed 修飾子または unsigned 修飾子のない変数 char は、コンパイラに応じて符号付きにも符号なしにもできます。

リスク

プレーンの char での演算結果が予期しない数値になる可能性があります。この char をオフセットに使うと、この char がバッファー オーバーフローまたはアンダーフローの原因となる場合があります。

修正方法

処理系定義の混乱を避けるために、char 変数を初期化するときに、その char が符号付きか符号なしかを明示的に指定します。

チェッカーの拡張

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

すべて展開する

#include <stdio.h>

void badplaincharuse(void)
{
    char c = 200;
    int i = 1000;
    (void)printf("i/c = %d\n", i/c);
}

この例の char 変数 c が符号付きになるか符号なしになるかはコンパイラによって異なる可能性があります。2 の補数形式の 8 ビット文字型だとすると、結果は i/c = 5 (符号なし char) または i/c = -17 (符号付き char) となります。char の符号属性が不明であれば、正しい結果はわかりません。

修正 — 修飾子 signed を追加

考えられる 1 つの修正方法として、修飾子 signedchar に追加します。このように明確に指定することで、定義された演算になります。

#include <stdio.h>

void badplaincharuse(void)
{
    signed char c = -56;
    int i = 1000;
    (void)printf("i/c = %d\n", i/c);
}

結果情報

グループ: 数値
言語: C | C++
既定値: オフ
コマンド ライン構文: BAD_PLAIN_CHAR_USE
影響度: Medium

バージョン履歴

R2016b で導入