Ни C, ни стандартные разработчики силы POSIX не используют malloc()
, поэтому нет общего ответа на ваш вопрос.
Тем не менее, каждая нормальная реализация стандартной библиотеки, которая использует malloc()
в одной из своих функций, будет устанавливать errno
в ENOMEM
, если malloc()
завершится неудачей. Следовательно, вы можете извлечь из документации, использует ли библиотечная функция malloc()
или нет. Точка в случае: в моей системе mmap()
может использовать malloc()
, поскольку mmap()
может установить errno
на ENOMEM
.
Тем не менее, использование valgrind
является плохим способом выяснить, вызывает ли конкретная функция malloc()
или нет. Рассмотрим следующий фрагмент кода:
void foo(int x)
{
if (!x) malloc(1);
}
Если вы вызываете эту функцию с аргументом, отличным от 0
, valgrind не заметит, что на самом деле может вызвать malloc()
. Думайте о valgrind
как о виртуальной машине (поскольку это то, что она есть): она не смотрит на ваш код, она видит только то, что на самом деле машина будет выполнять.