INT16-C. 符号付き整数の表現形式について勝手な想定をしない
多くの一般的な処理系は符号付き整数を2の補数表現で表すが、C 標準では符号付き整数の表現形式は処理系定義とされており、以下のすべての表現形式が可能である。
- 符号付き絶対値表現
- 2の補数
- 1の補数
これは、「MSC14-C. 必要もなくコードをプラットフォーム依存にしない」の具体例の一つである。
違反コード
ある数値が偶数であるか奇数であるかをチェックする手段の一つは、最下位ビットを調べることである。しかしこの方法は一貫しない結果を返す。特に、1の補数表現では予期せぬ動作になるだろう。
int value; if (scanf("%d", &value) == 1) { if (value & 0x1 != 0) { /* 値が奇数のときの処理 */ } }
適合コード
このようなチェックを行いたければ剰余演算子を使うべきだ。
int value; if (scanf("%d", &value) == 1) { if (value % 2 != 0) { /* 値が奇数のときの処理 */ } }
リスク評価
整数表現について勝手な想定をすると、意図せぬコードが実行されたり、予期せぬ動作が発生するおそれがある。
レコメンデーション |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
---|---|---|---|---|---|
INT16-C |
中 |
低 |
高 |
P2 |
L3 |
自動検出(最新の情報はこちら)
ツール |
バージョン |
チェッカー |
説明 |
v8.2 |
2940, 2941, 2942, 2943, 2945, 2946, 2947, 2948 |
|
翻訳元
これは以下のページを翻訳したものです。
INT16-C. Do not make assumptions about representation of signed integers (revision 28)