Как я могу смягчить целочисленное переполнение в этом коде? - PullRequest
0 голосов
/ 20 мая 2018

Когда я ввожу «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 голосов
/ 20 мая 2018

Вероятно, в вашей реализации C int, size_t и char * - это каждый 32 бита, четыре байта.Когда val равно 1073741824, val * sizeof(char *) переполняется и, как это происходит, выдает ноль.Затем mem = malloc(val * sizeof(char *)); выделяет ноль байтов памяти.Он возвращает действительный указатель на ноль байтов, а не NULL, поэтому ваш тест на NULL не приводит к завершению вашей программы.

Затем ваша программа пытается записать 1073741824 байта в выделенную память.Поскольку было выделено ноль байтов, он заполняет пространство и вылетает.

mem = malloc(val * sizeof(char *)); должно быть mem = malloc(val * sizeof(char)); или, что лучше, mem = malloc(val * sizeof *mem):.

...