| Предыдущий | Следующий |
| EISDIR | ENFILE |
EINVAL
Ошибка контракта, смысл которой определяется местом вызова
У EINVAL нет одной универсальной причины. Код сообщает, что вызванный интерфейс отклонил один или несколько аргументов либо их сочетание. Для mmap() это может быть неверный адрес, длина, смещение или комбинация флагов отображения. Для strtol() причиной бывает неподдерживаемое основание системы счисления. Полезное объяснение нужно искать в документированном предусловии конкретной функции, а не в общей фразе «неверный параметр».
Не каждый интерфейс сообщает этот код через errno. POSIX-функция posix_memalign() возвращает EINVAL напрямую, если выравнивание не является степенью двойки либо не кратно sizeof(void *); руководство отдельно указывает, что errno при этом не изменяется. Обработка должна соответствовать соглашению о возврате именно этого API.
Полезные данные для диагностики
| Интерфейс | Пример условия |
|---|---|
mmap() | Недопустимый адрес, длина, смещение либо отсутствующий обязательный режим отображения. |
posix_memalign() | Выравнивание не является степенью двойки или не кратно sizeof(void *). |
strtol() | Выбранное основание не поддерживается реализацией. |
- Записывайте имя функции и исходные числовые значения всех значимых аргументов, флагов, длин, смещений и выравниваний.
- Проверяйте связи между параметрами — зависимости флагов и требования выравнивания, — а не только каждое значение отдельно.
- Отбрасывайте неподдерживаемые параметры на границе приложения и сохраняйте контекст неудачного вызова в диагностике.
- Не повторяйте неизменённый вызов: в отличие от временной нехватки ресурса,
EINVALобычно требует других данных или другого пути API.
Ссылки
- Руководство Linux: mmap(2)
- Руководство Linux: posix_memalign(3)
- Руководство Linux: strtol(3)
- POSIX: posix_memalign()
Нужно найти другой код? Найти другой код состояния или ошибки.