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

Целочисленные переполнения и преобразования

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

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 5 темам.
Вопрос 1 из 25
Что происходит при вычислении `INT_MAX + 1` в типе `int`?
CC17
int x=INT_MAX; int y=x+1;
Вопрос 2 из 25
Как безопасно проверить сложение `a + b`, если известно, что `b > 0`?
CC17
int add_checked(int a, int b, int *out) {
    /* известно, что b > 0; выбрать проверку до вычисления a + b */
}
Вопрос 3 из 25
Почему вызов `abs(INT_MIN)` нельзя считать безопасным?
CC17
int m=abs(INT_MIN);
Вопрос 4 из 25
Как проверить произведение двух неотрицательных размеров `a * b` до вычисления?
CC17
if(b && a>SIZE_MAX/b) fail();
Вопрос 5 из 25
Когда насыщаемая арифметика уместна вместо сообщения о переполнении?
Вопрос 6 из 25
Каков результат `UINT_MAX + 1u`?
CC17
unsigned x=UINT_MAX; printf("%u\n",x+1u);
Вопрос 7 из 25
Почему выражение `size_t remain = capacity - used;` опасно без предварительной проверки?
CC17
size_t remain = capacity - used;
/* Оба значения получены извне, отношение между ними ещё не проверено. */
Вопрос 8 из 25
Как корректно обойти массив в обратном порядке, если индекс имеет тип `size_t`?
CC17
for(size_t i=n;i-- > 0;) use(a[i]);
Вопрос 9 из 25
В какой ситуации переход беззнакового значения по модулю может быть частью корректного решения?
Вопрос 10 из 25
Почему условие `n - 1 < n` ложно при `size_t n = 0`?
CC17
size_t n=0; printf("%d\n",n-1<n);
Вопрос 11 из 25
Как вычисляется выражение `a + b`, если `a` и `b` имеют тип `unsigned char`, а диапазона `int` достаточно?
CC17
unsigned char c=a+b;
Вопрос 12 из 25
Почему приведение результата `(uint32_t)(x << 24)` может быть запоздалым, если `x` имеет тип `signed char`?
CC17
uint32_t v=(uint32_t)(x<<24);
Вопрос 13 из 25
Какой тип имеет результат выражения `sizeof(char) + 1`?
CC17
#define EXPR (sizeof(char) + 1)
/* определите тип выражения EXPR */
Вопрос 14 из 25
Почему самостоятельное выражение `~(uint8_t)0` на типичной реализации с 32-битным `int` не имеет значения `0xFF`?
CC17
unsigned x=~(uint8_t)0;
Вопрос 15 из 25
Как избежать неожиданного продвижения типов при упаковке байтов в `uint32_t`?
CC17
uint8_t b0, b1, b2, b3;
uint32_t v = /* безопасно упаковать четыре байта */;
Вопрос 16 из 25
Какое значение печатает выражение `-1 < 1u` по правилам языка?
CC17
printf("%d\n",-1<1u);
Вопрос 17 из 25
Как безопасно сравнить знаковый индекс `int index` с размером `size_t n`?
CC17
if(index>=0 && (size_t)index<n) use(a[index]);
Вопрос 18 из 25
Почему такой код опасен, если `read()` вернёт ошибку?
CC17
size_t n = (size_t)read(fd, buf, cap);
process_bytes(buf, n);
Вопрос 19 из 25
Можно ли привести `size_t` к `int` только ради удаления предупреждения компилятора?
Вопрос 20 из 25
Как безопасно сравнить `ptrdiff_t d` с ограничением `size_t limit`?
CC17
if(d>=0 && (size_t)d<limit) ...
Вопрос 21 из 25
Где стандартно определены границы типа `int`?
CC17
void print_int_range(void) {
    printf("%d %d\n", /* нижняя граница */, /* верхняя граница */);
}
Вопрос 22 из 25
Как в GCC или Clang проверить знаковое сложение на переполнение, не выполняя опасную операцию?
CC17
int out;
/* выбрать средство GCC или Clang, которое проверяет a + b
   без предварительного выполнения опасного знакового сложения */
Вопрос 23 из 25
Какие ошибки при выполнении программы обнаруживает обычная конфигурация UBSan со включённой проверкой знакового переполнения?
Вопрос 24 из 25
Какие тесты лучше всего проверяют функцию безопасного сложения?
Вопрос 25 из 25
Что сообщает предупреждение `-Wsign-conversion`?
CC17
cc -Wall -Wextra -Wconversion -Wsign-conversion file.c

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

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

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

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