Итак, я запустил некоторый статический анализатор кода над некоторым кодом 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