Итак, я запустил некоторый статический анализатор кода поверх некоторого кода на C, и одна вещь, которая удивила меня, была предупреждением о:
int val;
scanf("%d", &val);
, который сказал, что для достаточно большого ввода это может привести к segfault.И, конечно же, это действительно может произойти.Теперь исправление достаточно простое (укажите некоторую ширину; в конце концов, мы знаем, сколько мест может иметь максимально допустимое целое число в зависимости от архитектуры), но меня интересует то, ПОЧЕМУ это происходит в первую очередь и почему это не так.не считается ошибкой в libc (и это просто исправить)?
Теперь я предполагаю, что есть какая-то причина для такого поведения в первую очередь, что я пропускаю?
Редактировать: Хорошо, так как вопрос, кажется, не такой четкий, немного болееОбъяснение: Нет, анализатор кода не предупреждает о scanf в целом, но о том, что scanf читает цифру без определенной ширины.
Итак, вот минимальный рабочий пример:
#include <stdlib.h>
#include <stdio.h>
int main() {
int val;
scanf("%d", &val);
printf("Number not large enough.\n");
return 0;
}
Мыможет получить ошибку, отправив гигантский номер (используя, например, 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