Как отмечает cnicutar , valgrind может влиять на все, что связано с синхронизацией, и обработчики сигналов, безусловно, подойдут.
Я не думаю, что snprintf
безопасно использовать в обработчике сигналов, поэтому он может работать в случае non-valgrind исключительно случайно, а затем входит valgrind, меняет время и вы получаете пламенную смерть, которая ты рисковал без валигринда.
Я нашел список функций, которые безопасны в обработчиках сигналов (согласно POSIX.1-2003) здесь:
http://linux.die.net/man/2/signal
Да, справочные страницы linux.die.net
немного устарели, но список здесь (спасибо RedX за то, что нашли это):
https://www.securecoding.cert.org/confluence/display/seccode/SIG30-C.+Call+only+asynchronous-safe+functions+within+signal+handlers
также не упоминает snprintf
кроме как в контексте OpenBSD, где говорится:
... асинхронно-безопасный в OpenBSD, но "вероятно, не в других системах", включая snprintf (), ...
Таким образом, подразумевается, что snprintf
, как правило, небезопасен в обработчике сигналов.
И, благодаря Nemo , у нас есть авторитетный список функций, которые безопасны для использования в обработчиках сигналов:
http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03
Начните с этой ссылки и найдите вниз _Exit
, и вы увидите список; тогда вы увидите, что snprintf
нет в списке.
Также я помню, как использовал write()
в обработчике сигналов, потому что fprintf
не был безопасен для обработчика сигналов, но это было давно.
У меня нет копии соответствующего стандарта, поэтому я не могу подкрепить это чем-то действительно авторитетным, но я все равно упомянул об этом.