LINUX.ORG.RU

[C] строки dlerror/strerror

 


0

0
const char *s = dlerror();
big_function();
puts(s);

Есть ли гарантия, что по адресу, который я запомнил, всегда будет одна и та же строка? Т. е. нет ли там внутри какого-нибудь буфера (я про гарантии стандартов).

Ну и тот же вопрос относительно strerror(errno).

★★★★

Ответ на: комментарий от bukaka

Ну ладно, есть strerror_r (что тоже намекает), но как быть с dlerror в многопоточной среде...

Четкая информация об этом нашлась в манах z/OS. Но вряд ли им можно верить )

unsigned ★★★★
() автор топика

errno и сопутствующее - legacy говно столетней давности.

В современных программах, особенно многопоточных, его применять нельзя.

anonymous
()
Ответ на: комментарий от anonymous

>В современных программах, особенно многопоточных, его применять нельзя.

Это почему же? Мусье не знает, что у каждого потока свой errno?

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Это не гарантируется.
И опять же, как тонны костылей и workaround'ов в реализациях рантайма Си, делают его не говном, и не столетней давности?

anonymous
()
Ответ на: комментарий от anonymous

Ну это ясно, я думал ты юниксовый errno задепрекейтил предал анафеме.

unsigned ★★★★
() автор топика
Ответ на: комментарий от anonymous

В Линаксе гарантируется:

man errno

errno is thread-local; setting it in one thread does not affect its value in any other thread.

Я смотрел реализацию в NetBSD, там оно тоже thread-local.

yoghurt ★★★★★
()
Ответ на: комментарий от anonymous

> Это не гарантируется. И опять же, как тонны костылей и workaround'ов в реализациях рантайма Си, делают его не говном, и не столетней давности?

The value of errno should only be examined when it is indicated to be valid by a function’s return value. No function in this volume of IEEE Std 1003.1-2001 shall set errno to zero. For each thread of a process, the value of errno shall not be affected by function calls or assignments to errno by other threads.

IEEE Std 1003.1™, 2004 Edition

Where is your god now?

anonymous
()

Не нарантируется. На практике - со стандартными строкам ошибок проблем не будет, но есть динамические строки для неизвестных кодов (strerror(123123) -> «Unknown error: 123123») - вот для них используется статический буффер, а его могут изменить где-то посередине. Насчет dlerror не знаю.

slovazap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.