Рассмотрим следующую программу (C99):
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
int main(void)
{
printf("Enter int in range %jd .. %jd:\n > ", INTMAX_MIN, INTMAX_MAX);
intmax_t i;
if (scanf("%jd", &i) == 1)
printf("Result: |%jd| = %jd\n", i, imaxabs(i));
}
Теперь, насколько я понимаю, это содержит легко запускаемое поведение undefined, например:
Enter int in range -9223372036854775808 .. 9223372036854775807:
> -9223372036854775808
Result: |-9223372036854775808| = -9223372036854775808
Вопросы:
-
Это действительно поведение undefined, так как в "коду разрешено запускать любой путь кода, какой любой код, который инсулирует компилятор", когда пользователь вводит плохой номер? Или это какой-то другой не совсем определенный?
-
Как бы педантичный программист защищался от этого, не делая никаких предположений, не гарантированных стандартом?
(Есть несколько связанных вопросов, но я не нашел ответа на вопрос 2 выше, поэтому, если вы предлагаете дубликат, убедитесь, что он отвечает на это.)