如何缓解此代码中的整数溢出?

How can I mitigate integer overflow in this code?

当我输入“1073741824”时,它returns "Segmentation fault"。

"1073741824"为4294967296÷4,即(INT_MAX+1)÷(sizeof(char *)).

此外,这是此代码中 malloc() 的参数。

但我不知道如何缓解这个问题。

请帮帮我。

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

int main(int argc, char **argv)
{
    int val, i;
    char *mem;

    if (argc < 2)
        exit(1);

    val = atoi(argv[1]);

   if (val > 0) {
        mem = malloc(val * sizeof(char *));

      if (mem == NULL) {
          printf("Failure\n");
          exit(2);
      }
    }

    for (i = 0; i < val; i++) {
        mem[i] = 'A';
        printf("%c", mem[i]);
    }

    printf("\n");

    return 0;
}

很可能,在您的 C 实现中,intsize_tchar * 都是 32 位,四个字节。当 val 为 1073741824 时,val * sizeof(char *) 溢出,碰巧产生零。然后 mem = malloc(val * sizeof(char *)); 分配零字节内存。它 returns 一个指向零字节而不是 NULL 的有效指针,因此您对 NULL 的测试不会导致程序退出。

然后您的程序尝试将 1073741824 字节写入分配的内存。由于分配了零字节,它会超出 space 并崩溃。

mem = malloc(val * sizeof(char *)); 应该是 mem = malloc(val * sizeof(char)); 或者更好的是 mem = malloc(val * sizeof *mem):.