scanf% d segfault при большом вводе

Итак, я запустил некоторый статический анализатор кода над некоторым кодом c, и одна вещь, которая меня удивила, это предупреждение о:

int val;
scanf("%d", &val);

, в котором говорилось, что для достаточно большого ввода это может привести к сбою в работе. И, конечно же, это действительно может произойти. Теперь исправление достаточно простое (укажите некоторую ширину; в конце концов, мы знаем, сколько мест может иметь действительное целое число, в зависимости от архитектуры), но меня интересует, ПОЧЕМУ это происходит в первую очередь и почему это не Не рассматривается ли это как ошибка в libc (и ее легко исправить)?

Теперь я предполагаю, что в первую очередь я упускаю какую-то причину такого поведения?

Редактировать: Хорошо, поскольку вопрос не кажется таким четким, еще немного пояснения: Нет, анализатор кода предупреждает не о scanf в целом, а о том, что scanf читает цифру без ширины, указанной в конкретном.

Итак, вот минимальный рабочий пример:

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

int main() {
    int val;
    scanf("%d", &val);
    printf("Number not large enough.\n");
    return 0;
}

Мы можем получить segfault, отправив гигантское число (используя например, Python):

import subprocess
cmd = "./test"
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, shell=True)
p.communicate("9"*50000000000000)
# program will segfault, if not make number larger
6
задан Voo 2 July 2011 в 12:56
поделиться