Является ли malloc детерминированным?

Является ли malloc детерминированным? Скажем, у меня есть разветвленный процесс, то есть реплика другого процесса, и в какой-то момент они оба вызывают функцию malloc . Будет ли назначенный адрес одинаковым в обоих процессах? Предполагая, что другие части исполнения также детерминированы.

Примечание. Здесь я говорю только о виртуальной памяти, а не о физической.

25
задан Jens 21 May 2012 в 14:34
поделиться

3 ответа

Спецификация C99 (по крайней мере, в ее окончательном публичном проекте ) гласит в «J.1 Неопределенное поведение»:

Следующие не определены: ... The порядок и непрерывность памяти, выделяемой последовательными вызовами функций calloc, malloc и realloc (7.20.3).

Так что может показаться, что malloc не должен быть детерминированным. Поэтому небезопасно предполагать, что это так.

11
ответ дан 28 November 2019 в 20:53
поделиться

Это зависит от подробных реализаций malloc. Типичная реализация malloc (например, dlmalloc ) была детерминированной. Это просто потому, что сам алгоритм является детерминированным.

Однако из-за многих атак безопасности, таких как атаки переполнения кучи, malloc, то есть менеджер кучи, привнес некоторую случайность в свои реализации. (Но ее энтропия относительно невелика, потому что менеджеры кучи должны учитывать скорость и пространство). Поэтому безопасно, чтобы вы не принимали строгий детерминизм в менеджерах кучи.

Кроме того, когда вы разветвляете процесс, появляются различные источники случайности, включая ASLR .

2
ответ дан 28 November 2019 в 20:53
поделиться

Вы не получите тот же физический адрес. Если у вас есть процессы A и B, каждый вызов malloc возвращает адрес свободного блока. Порядок, в котором A и B вызывают malloc, непредсказуем. Но это никогда не происходит "в один и тот же момент".

0
ответ дан 28 November 2019 в 20:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: