如何缓解此代码中的整数溢出?
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 实现中,int
、size_t
和 char *
都是 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):
.
当我输入“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 实现中,int
、size_t
和 char *
都是 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):
.