Является ли malloc детерминированным? Скажем, у меня есть разветвленный процесс, то есть реплика другого процесса, и в какой-то момент они оба вызывают функцию malloc . Будет ли назначенный адрес одинаковым в обоих процессах? Предполагая, что другие части исполнения также детерминированы.
Примечание. Здесь я говорю только о виртуальной памяти, а не о физической.
Спецификация C99 (по крайней мере, в ее окончательном публичном проекте ) гласит в «J.1 Неопределенное поведение»:
Следующие не определены: ... The порядок и непрерывность памяти, выделяемой последовательными вызовами функций calloc, malloc и realloc (7.20.3).
Так что может показаться, что malloc не должен быть детерминированным. Поэтому небезопасно предполагать, что это так.
Это зависит от подробных реализаций malloc
. Типичная реализация malloc
(например, dlmalloc ) была детерминированной. Это просто потому, что сам алгоритм является детерминированным.
Однако из-за многих атак безопасности, таких как атаки переполнения кучи, malloc
, то есть менеджер кучи, привнес некоторую случайность в свои реализации. (Но ее энтропия относительно невелика, потому что менеджеры кучи должны учитывать скорость и пространство). Поэтому безопасно, чтобы вы не принимали строгий детерминизм в менеджерах кучи.
Кроме того, когда вы разветвляете процесс, появляются различные источники случайности, включая ASLR .
Вы не получите тот же физический адрес. Если у вас есть процессы A и B, каждый вызов malloc возвращает адрес свободного блока. Порядок, в котором A и B вызывают malloc, непредсказуем. Но это никогда не происходит "в один и тот же момент".