Безопасно ли называть dlclose(NULL)?
Я испытываю сбой, когда я прохожу null
указатель на dlclose
,
Должен ли я проверить на ноль перед звонком dlclose
?
POSIX ничего не говорит об этом: http://pubs.opengroup.org/onlinepubs/7908799/xsh/dlclose.html
Это неопределенное поведение или ошибка в dlclose
реализация?
3 ответа
Это сложно. POSIX утверждает, что
если
handle
не относится к открытому объекту,dlclose()
возвращает ненулевое значение
из которого можно сделать вывод, что для произвольного указателя он должен определить, относится ли этот указатель к открытому объекту. Версия для Linux/Glibc, по-видимому, не выполняет такую проверку, поэтому вы захотите проверить NULL
сам.
[Кроме того, справочная страница Linux также не очень полезна. Это неявно о libdl
поведение функций, откладывание до POSIX без очень четкого заявления о соответствии.]
Это также ничего не говорит о принятии NULL
и не врезаться. Мы можем предположить из вашего теста, что он не делает явного NULL
проверьте, и он должен каким-то образом использовать указатель для выполнения действия закрытия... так что у вас есть.
После malloc
/free
Соглашение (1), это ошибка. Если это следует fopen
/fclose
конвенция (2) это не так. Так что, если есть ошибка, она есть в стандарте, потому что в ней отсутствует соглашение по работе с зомби.
- Соглашение (1) хорошо работает с семантикой перемещения C++11
- Конвенция (2) оставляет большую ответственность за вызывающего абонента. В частности, dtor должен явно проверить на ноль, была ли выполнена операция перемещения.
Я думаю, что это то, что должно быть пересмотрено для предстоящей редакции POSIX, чтобы избежать путаницы.
Обновить
Я нашел из этого ответа https://stackru.com/a/6277781/877329, а затем читал man pthread_join
что вы можете позвонить pthread_join
с недействительным тид, поддерживая malloc/free
convension. Еще одна проблема, которую я обнаружил с динамическим интерфейсом загрузчика, заключается в том, что он не использует стандартную систему обработки ошибок, но имеет свою собственную dlerror
функция.