C C  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Переносимый код по стандарту C

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

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 6 темам.
Вопрос 1 из 30
Что показывает макрос `__STDC_VERSION__`?
CC17
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
_Static_assert(sizeof(int)>=2,"int range");
#endif
Вопрос 2 из 30
Почему успешная компиляция `typeof(x)` в режиме по умолчанию не делает код соответствующим ISO C?
CC17
typeof(x) y = x;
Вопрос 3 из 30
Как разумно использовать возможность C23 в библиотеке, которая обязана поддерживать C17?
Вопрос 4 из 30
Что изменяет выбор `-std=gnu17` по сравнению с `-std=c17`?
CC17
cc -std=gnu17 source.c
Вопрос 5 из 30
Почему стандарт языка и стандарт системного API — не одно и то же?
Вопрос 6 из 30
Гарантирует ли стандарт C, что `int` имеет ровно 32 бита?
Вопрос 7 из 30
Почему `%lu` не является переносимым форматом для size_t?
CНесовпадение формата и фактического типа
size_t n = get_count();
printf("%lu\n", n);  /* непереносимый вариант */
Вопрос 8 из 30
В какой реализации тип `uint32_t` может отсутствовать?
Вопрос 9 из 30
Как печатать `uint64_t` переносимо?
CC17
#include <stdint.h>
#include <stdio.h>

uint64_t value = get_value();
printf(/* выбрать переносимый формат */, value);
Вопрос 10 из 30
Почему обычный `char` нельзя без проверки считать знаковым?
CC17
char c=(char)0xFF;
if(c<0) ... /* зависит от реализации */
Вопрос 11 из 30
Почему проверка `#ifdef __linux__` хуже проверки наличия конкретной возможности?
CC17
#ifdef __linux__
    use_posix_memalign();
#else
    use_fallback_allocator();
#endif
Вопрос 12 из 30
Какой риск у ветви, которая не собирается в основной среде разработчика?
Вопрос 13 из 30
Почему конфигурационные возможности удобнее задавать макросами 0 или 1 и проверять через `#if`?
CC17
#define FEATURE_TLS 0
#ifdef FEATURE_TLS
/* ошибочно включится */
#endif
Вопрос 14 из 30
Как уменьшить количество платформенных `#ifdef` в основной логике программы?
Вопрос 15 из 30
Что неверно в проверке порядка байтов через нестандартный предопределённый макрос без запасного пути?
CC17
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
  ...
#endif
Вопрос 16 из 30
Почему бинарный режим файла важен на некоторых системах?
CC17
FILE *f=fopen(path,"rb");
Вопрос 17 из 30
Почему нельзя одинаково соединять компоненты пути строкой `dir + "/" + name` на всех платформах?
Вопрос 18 из 30
Как текущая локаль может повлиять на `strtod`?
CC17
double x=strtod("1.25",&end); /* смысл точки зависит от locale */
Вопрос 19 из 30
Почему `time_t` нельзя безусловно сериализовать как знаковое 32-битное число?
Вопрос 20 из 30
Что переносимо можно утверждать о `rename`, если имя назначения уже существует?
Вопрос 21 из 30
Зачем собирать переносимый код и GCC, и Clang?
CC17
gcc -std=c17 -Wall -Wextra -pedantic ...
clang -std=c17 -Wall -Wextra -pedantic ...
Вопрос 22 из 30
Что именно проверяет `_Static_assert(sizeof(uint32_t) * CHAR_BIT == 32, ...)`?
CC17
_Static_assert(sizeof(uint32_t)*CHAR_BIT==32,"need 32 bits");
Вопрос 23 из 30
Как проверить код на системе с прямым порядком байтов, не имея физической машины?
Вопрос 24 из 30
Почему 32-битная сборка полезна даже на 64-битном хосте?
CC17
cc -m32 -std=c17 test.c -o test32
Вопрос 25 из 30
Что должно входить в тесты переносимой сериализации?
CC17
assert(memcmp(encoded,"\x01\x02\x03\x04",4)==0);
Вопрос 26 из 30
Почему `write(fd, &key, sizeof key)` может записать в файл больше секретных данных, чем ожидает программист?
Вопрос 27 из 30
Можно ли сохранить указатель как `uintptr_t` и восстановить его в другом запуске процесса?
Вопрос 28 из 30
Как поступить с зависящим от реализации правым сдвигом отрицательного знакового числа?
CC17
int x=-4;
int y=x>>1; /* реализация определяет результат */
Вопрос 29 из 30
Почему тип `long` плохо задаёт 64-битное поле публичного двоичного API?
Вопрос 30 из 30
Что надёжнее для проверки переполнения при преобразовании внешнего uint64_t в size_t?
CC17
uint64_t value = read_external_u64();
size_t n;
/* выбрать проверку, которую нужно выполнить до преобразования value в size_t */

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

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

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

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