GNU/Linux >> Linux の 問題 >  >> Linux

C 整数オーバーフローの防止

C では、必要なヘッダー ファイルは <stdint.h> です 定数は UINT32_MAX です

static void update_value(char op)
{
    if (op == '+')
        if ( value < (UINT32_MAX - 1))
            value++;    // uint32_t global value
        else
            printf("too big!\n");
    else
       if (value > 0)
           value--;
       else
           printf("too small!\n");
}

C++ の場合、ここにあるソリューションをいくつでも使用できます:UINT32_MAX に相当する C++ は何ですか?


最も一般的な解決策は、増加した値が実際に前の値よりも大きいかどうか、または減少した値が前の値よりも小さいかどうかを確認することです。これは、値が符号なしの場合にのみ機能します 、変数のサイズとは関係なく、C コードと同じくらい移植性があります。

static void update_value(char op)
{
  if (op == '+') {
    if (value + 1 > value) value ++;
  } else {
    if (value - 1 < value) value --;
  }
}

コードは符号付きの値で動作する可能性があることに注意してください 、しかし C 標準では、これは未定義の動作であり、コンパイラは if (value + 1 > value) ... を自由に置き換えることができます if (1) ... で . すべきではない リンクされた後生成されたオブジェクト コードを監査するプロセスがない限り、このコードを符号付きの値で使用します。 .

gcc と clang では、 -fwrapv を追加する必要があります このコードを符号付きの値に対して機能させるオプション。他のコンパイラでは、マイレージが異なる場合があります。

これを行う適切な方法は、型固有であり、limits.h からの定数を使用することです .例:

#include "limits.h"

static void update_int(char op, int *value)
{
  int val = *value; // ignoring NULL pointer dereference

  if (op == '+') {
    if (val != INT_MAX) *value = val + 1;
  } else {
    if (val != INT_MIN) *value = val - 1;
  }
}

static void update_int(char op, unsigned int *value)
{
  unsigned int val = *value; // ignoring NULL pointer dereference

  if (op == '+') {
    if (val != UINT_MAX) *value = val + 1;
  } else {
    if (val != UINT_MIN) *value = val - 1;
  }
}

<limits> を探しているかもしれません :http://www.cplusplus.com/reference/limits/numeric_limits/

必要なものを得るために、次のようなことができます:

unsigned int n = numeric_limits<unsigned int>::max()

この <cstdint> もあります :http://www.cplusplus.com/reference/cstdint/

UINTN_MAX:正確な幅の符号なし型の最大値 (ちょうど 2^N-1)


Linux
  1. bashスクリプトが同時に実行されないようにする

  2. Bashで割った数を四捨五入する

  3. Linux の最大 PID

  1. 列値条件で awk を使用する

  2. bashでkill SIGUSR2を使用するには?

  3. x =os.system(..) の戻り値

  1. プロセスIDの最大値は?

  2. デフォルトの arp キャッシュ タイムアウト

  3. プロセスの優先度はどのように計算されますか?