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

时间:2018-05-20 12:46:18

标签: c integer-overflow limits

当我输入“1073741824”时,它返回“分段故障”。

“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;
}

1 个答案:

答案 0 :(得分:2)

可能在您的C实现中,C:\rakudo\bin\lib>perl6 -v This is Rakudo Star version 2018.04.1 built on MoarVM version 2018.04.1 implementing Perl 6.c. C:\rakudo\bin\lib>perl6-debug-m ←[35m>>> LOADING ←[0m<REPL 1> ←[34m+ <REPL 1> (1 - 1)←[0m ←[34m| ←[0m←[1;33mREPL←[0m ←[34m> ←[0mquit ←[34m- ←[0mRun END blocks (y/N)? C:\rakudo\bin\lib>perl6 -V |grep -v "moar:" distro::auth=unknown distro::desc=2018-05-20T09:17:12.587605-04:00 distro::is-win=True distro::name=mswin32 distro::path-sep=; distro::release=unknown distro::signature= distro::version=6.3 kernel::arch=unknown kernel::archname=unknown-win32 kernel::auth=unknown kernel::bits=64 kernel::desc= kernel::hardware=unknown kernel::name=win32 kernel::release=unknown kernel::signature= kernel::version=unknown perl6::build-date=2018-05-07T10:08:20Z perl6::codename= perl6::implementation=Rakudo Star perl6::language_version=6.c perl6::libdir=C:\rakudo\share perl6::prefix=C:\rakudo perl6::release-number= perl6::source-digest=688d0872d150048d083b7a499e9fc7a9e8b6ab5b perl6::version=2018.04.1 repo::chain=inst#C:\Users\danhale\.perl6 inst#C:\rakudo\share\perl6\site inst#C:\rakudo\share\perl6\vendor inst#C:\rakudo\share\perl6 ap# nqp# perl5# intsize_t各为32位,四个字节。当char *为1073741824时,val溢出,并且当它发生时,产生零。然后val * sizeof(char *)分配零字节的内存。它返回一个指向零字节的有效指针,而不是NULL,因此对NULL的测试不会导致程序退出。

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

mem = malloc(val * sizeof(char *));应为mem = malloc(val * sizeof(char *));或更好,mem = malloc(val * sizeof(char));