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

Безопасная обработка строк

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

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 5 темам.
Вопрос 1 из 25
Сколько байтов нужно выделить для копии корректной C-строки `s`?
CC17
size_t n=strlen(s); if(n==SIZE_MAX) fail(); char *p=malloc(n+1);
Вопрос 2 из 25
Сколько байтов нужно зарезервировать в буфере для строки длиной `n` символов?
Вопрос 3 из 25
Как вычислить размер буфера для `prefix + name + suffix + NUL`?
Вопрос 4 из 25
Что означает вызов `snprintf` с размером буфера, равным нулю?
CC17
int r=snprintf(NULL,0,"%s:%d",name,id);
Вопрос 5 из 25
Почему текущую длину строки и вместимость буфера нужно хранить раздельно?
Вопрос 6 из 25
Почему вызов `printf(user_input)` уязвим?
CC17
printf(user_input);
Вопрос 7 из 25
Какой спецификатор `printf` соответствует типу `size_t`?
CC17
printf("%zu\n",n);
Вопрос 8 из 25
Как определить, что `snprintf` обрезала результат?
CC17
int r=snprintf(buf,cap,"%s",s);
Вопрос 9 из 25
Почему `%d` нельзя использовать для аргумента типа `long`?
CC17
long x=1; printf("%d\n",x);
Вопрос 10 из 25
Какие флаги компилятора особенно полезны для проверки форматных строк?
CC17
void log_user(const char *name) {
    printf(name); /* компилятор должен предупредить об опасной форматной строке */
}
Вопрос 11 из 25
Когда нужен `memmove` вместо `memcpy`?
CC17
memmove(buf+1,buf,n);
Вопрос 12 из 25
Почему `strncpy` может оставить результат без завершающего нуля?
CC17
strncpy(dst,src,cap);
Вопрос 13 из 25
Какой контракт ограниченного копирования наиболее прозрачен?
Вопрос 14 из 25
Почему `memcpy(dst, src, strlen(src))` не создаёт корректную копию строки?
CC17
size_t n=strlen(src); memcpy(dst,src,n);
Вопрос 15 из 25
Можно ли копировать структуру с помощью `memcpy`?
Вопрос 16 из 25
Почему `atoi` плохо подходит для разбора недоверенного числа?
CC17
int value = atoi(s);
Вопрос 17 из 25
Как отклонить лишние символы после числа, разобранного `strtol`?
CC17
char *end;
long value = strtol(s, &end, 10);
/* Выберите проверку, которая требует разбора всего поля. */
Вопрос 18 из 25
Чем опасен встроенный NUL в данных с явной длиной, если затем их передать строковому интерфейсу?
Вопрос 19 из 25
Когда нужно проверять максимально допустимую длину входа?
CC17
if(input_len>MAX_NAME) return TOO_LONG;
Вопрос 20 из 25
Гарантирует ли нулевой терминатор корректность UTF-8?
Вопрос 21 из 25
Какой санитайзер компилятора лучше всего обнаружит переполнение стекового буфера на выполненном пути?
CC17
void copy_name(const char *src) {
    char buf[16];
    strcpy(buf, src);
    use(buf);
}
Вопрос 22 из 25
Зачем добавлять встроенный NUL в набор входов для фаззинга парсера?
Вопрос 23 из 25
Что даёт `_FORTIFY_SOURCE` на поддерживаемой платформе?
Вопрос 24 из 25
Как безопасно записать в журнал недоверенный буфер без нулевого терминатора?
CC17
fwrite(buf,1,n,stderr);
Вопрос 25 из 25
Какой регрессионный тест нужен после исправления переполнения буфера?

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

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

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

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