C C  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Неопределённое и неопределённо заданное поведение

Тест учит перестать угадывать вывод там, где стандарта уже нет: отличать неопределённое, неопределённо заданное и зависящее от реализации поведение, проверять упорядоченность вычислений и понимать, почему оптимизатор не обязан сохранять случайное поведение некорректной программы.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 5 темам.
Вопрос 1 из 25
Что именно означает неопределённое поведение по стандарту C?
Вопрос 2 из 25
Какой из фрагментов содержит неопределённое поведение по стандарту C?
CC17
int a[3]={1,2,3};
int x=a[3];
Вопрос 3 из 25
Почему знаковое переполнение относится к неопределённому поведению?
CC17
int x=INT_MAX; ++x;
Вопрос 4 из 25
Защитит ли проверка на `NULL`, если указатель уже разыменован раньше?
CC17
int v=*p;
if(!p) return ERROR;
Вопрос 5 из 25
Что делать с UB-вопросом “что выведет?”
Вопрос 6 из 25
Задан ли порядок вычисления аргументов функции в C17?
CC17
f(g(),h());
Вопрос 7 из 25
Какой вывод можно гарантировать для `printf("%d %d", f1(), f2())`, если функции не меняют общие объекты?
Вопрос 8 из 25
Чем неопределённо заданное поведение отличается от зависящего от реализации?
Вопрос 9 из 25
Как сделать порядок g затем h явным?
CC17
/* Порядок вычисления аргументов f не задан. */
f(g(), h());

/* Нужно гарантировать вызов g раньше h. */
Вопрос 10 из 25
Может ли неопределённо заданный выбор различаться между вызовами?
Вопрос 11 из 25
Почему `i = i++ + 1` опасно?
CC17
i=i++ + 1;
Вопрос 12 из 25
Безопасно ли `a[i++] = i`?
CC17
a[i++]=i;
Вопрос 13 из 25
Почему `&&` полезен для упорядочивания вычислений?
CC17
if(p && *p>0) ...
Вопрос 14 из 25
Задаёт ли оператор запятая последовательность вычисления своих операндов?
CC17
x=(prepare(),compute());
Вопрос 15 из 25
Как переписать `arr[i++] += f(i)`?
Вопрос 16 из 25
Почему проверка `if (x + 1 < x)` ненадёжна для знакового переполнения?
CC17
if(x+1<x) overflow();
Вопрос 17 из 25
Почему программа может казаться рабочей с `-O0` и ломаться с `-O2`?
Вопрос 18 из 25
Как правила строгого псевдонимного доступа помогают оптимизатору?
CC17
int *ip; float *fp;
*ip=1; *fp=0.0f; return *ip;
Вопрос 19 из 25
Устраняет ли `volatile` выход за границы массива?
Вопрос 20 из 25
Что надёжнее для checked addition int?
CC17
bool add_int(int a,int b,int *out){ /* precheck */ }
Вопрос 21 из 25
Какие ошибки доступа к памяти способен обнаружить этот запуск с AddressSanitizer на реально выполненных путях?
CC17
cc -fsanitize=address -g -fno-omit-frame-pointer app.c
Вопрос 22 из 25
Какой класс нарушений способен обнаружить этот запуск с UndefinedBehaviorSanitizer на реально выполненных путях?
CC17
cc -fsanitize=undefined -g app.c
Вопрос 23 из 25
Зачем сочетать фаззинг с санитайзерами?
Вопрос 24 из 25
Что даёт `-Wall -Wextra -Wconversion`?
CC17
cc -std=c17 -Wall -Wextra -Wconversion -Wshadow app.c
Вопрос 25 из 25
Почему одинаковый вывод программ, собранных GCC и Clang не доказывают отсутствие UB?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу