Подтвердить что ты не робот

Когда assert() не работает, каков код выхода программы?

Когда вызов assert() завершается с ошибкой, каков используемый код выхода и где он документирован?

4b9b3361

Ответ 1

В стандарте c99 указано, что assert вызывает abort, а материал abort указывает это на код возврата:

Реализованная в форме форма неудачного завершения статуса возвращается в среду хоста с помощью вызова вызова функции (SIGABRT).

Он описан в разделе 7.2.1.1 (assert) и 7.20.4.1 (прервать) стандарта c99 здесь.

Многие системы UNIX вернут 128 плюс номер сигнала (SIGABRT - это номер сигнала 6), поэтому вы можете получить 134. Что бы вы ни получили, это должно быть документировано реализацией C.

Например, см. здесь для gcc. Хотя он довольно молчал о том, что возвращается в вызывающую среду. Из конкретных разделов здесь:

Некоторые варианты выполняются библиотекой и операционной системой (или другой средой при компиляции для автономной среды); Подробнее см. в их документации.

И здесь:

Поведение большинства этих точек зависит от реализации библиотеки C и не определяется самим GCC.

Так выглядит glibc doco здесь о завершении программы (в частности, бит состояния выхода). В нем упоминаются соглашения, но нет твердых правил.

Ответ 2

Он специфичен для реализации. Вы можете сделать это:

int main()
{
    assert(0);
}

Затем запустите его:

> ./a.out
> echo $?
1 (<- or whatever)

Это, по крайней мере, скажет вам, чего ожидать от вашей установки. Я gettitng 134 на пару linux-боксов с gcc и g++.

Ответ 3

Я не могу найти фактическую спецификацию для нее (POSIX довольно сложно найти), но я нашел ссылку.

Заброшенное утверждение приводит к статусу выхода, который совпадает с тем, что EXIT_FAILURE расширяется (ссылка). Поскольку вы имеете дело с Linux, вы также имеете дело с POSIX, что дополнительно определяет поведение c99.

Ответ 4

Я работал с очередями сообщений posix. У меня такая же ошибка. mq_open не удалось выполнить с errono 38 (ENOSYS).

Работа arround - перестроить кенель с включенным POSIX MESSGE QUEUE в конфигурации ядра.

Это построит ядро ​​с поддержкой очереди сообщений POSIX, и это сработало для меня.

Спасибо