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

Коды ошибок и errno

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

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 5 темам.
Вопрос 1 из 25
Как правильно использовать `errno` после POSIX-вызова?
CC17
int fd=open(path,O_RDONLY);
if(fd==-1){ int e=errno; ... }
Вопрос 2 из 25
Почему проверка `if (errno) fail();` после ненулевого результата `malloc` может ложно сообщить об ошибке?
CC17
void *p=malloc(n);
if(errno) fail();
Вопрос 3 из 25
Функция `strtol` может законно вернуть `LONG_MAX`. Как отличить это значение от переполнения?
CC17
errno=0; char *end; long v=strtol(s,&end,10);
Вопрос 4 из 25
Почему значение `-1` — плохой единственный признак «не найдено», если функция поиска может законно вернуть любой `int`?
Вопрос 5 из 25
Как следует проверять результат `fclose(f)` и почему ошибку закрытия нельзя игнорировать?
CC17
if(fclose(f)==EOF){...}
Вопрос 6 из 25
Сбрасывает ли успешный вызов errno в 0?
CC17
errno = EIO;
int fd = open(valid_path, O_RDONLY);
/* open завершился успешно; какое значение errno теперь допустимо? */
Вопрос 7 из 25
Почему `int saved=errno` делают сразу?
CC17
if(close(fd)==-1){ int saved=errno; cleanup(); report(saved); }
Вопрос 8 из 25
Является ли errno безопасным между потоками?
Вопрос 9 из 25
Можно ли присваивать errno?
CC17
errno=0;
double x=strtod(s,&end);
Вопрос 10 из 25
Как обрабатывать интерфейс, который возвращает собственный код ошибки и при этом может менять `errno`?
Вопрос 11 из 25
Что печатает perror("open config")?
CC17
if((f=fopen(path,"r"))==NULL) perror("open config");
Вопрос 12 из 25
Почему `perror(NULL)` хуже контекстного сообщения?
Вопрос 13 из 25
Можно ли сравнивать строки strerror для логики?
CC17
if(strcmp(strerror(errno),"Permission denied")==0) ...
Вопрос 14 из 25
Почему библиотека не всегда должна сама вызывать perror?
Вопрос 15 из 25
Как сохранить правильный текст ошибки после очистки ресурсов?
CC17
if (open_file(path) < 0) {
    cleanup();
    fprintf(stderr, "%s: %s\n", path, strerror(errno));
}
Вопрос 16 из 25
Какой стиль удобен, если функция возвращает значение любого int и ошибку?
CC17
/* Разбираемое значение может быть любым int, включая -1. */
int value;
/* выбрать контракт функции parse, который отдельно сообщает об ошибке */
Вопрос 17 из 25
Что должно происходить с *out при ошибке?
Вопрос 18 из 25
Как обёртка должна добавлять контекст?
Вопрос 19 из 25
Почему отрицательные errno-like коды внутри модуля требуют документации?
CC17
return -EIO; /* какой контракт? */
Вопрос 20 из 25
Когда error object полезнее одного enum?
Вопрос 21 из 25
Как увидеть errno системного вызова в strace?
CC17
$ ./app
open config: Permission denied
# Нужно связать сообщение с конкретным системным вызовом.
Вопрос 22 из 25
Что означает внедрение отказов при тестировании обработки ошибок?
Вопрос 23 из 25
Что логировать при отказе open?
Вопрос 24 из 25
Как проверить очистка всех точек отказа конструктора?
CC17
for(int fail_at=1;fail_at<=steps;fail_at++) test_create_with_failpoint(fail_at);
Вопрос 25 из 25
Почему “повторить любую ошибку” опасно?

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

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

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

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