Ответ 1
Первая из двух связанных статей поднимает две жалобы выше и выше "проверенных вызовов успешно", которые уже подняты здесь.
Когда это будет сделано, старое содержимое будет отброшено и где-нибудь останется в памяти. Для приложений с защищенной памятью, где важно стереть все следы данных, это поведение неуместно.
Это допустимая точка, если вы храните конфиденциальные данные (например, закрытые ключи, незашифрованные (!) пароли и т.д.) и хотите усложнить для эксплойтов восстановление данных или других процессов в системе, чтобы украсть данных.
Поскольку он перемещает память вокруг, любые старые указатели на эту память становятся недействительными и могут привести к сбою программы или, как следствие, к неправильной работе.
Этот момент кажется мне бессмыслицей. Их предлагаемое решение не лучше, они malloc()
, копируют, а затем free()
оригинал, который имеет тот же чистый эффект - адрес изменился. Если вы хотите избежать перемещения памяти, вы можете использовать некоторые вызовы конкретной платформы, чтобы сделать это, если вы устроили для них достаточное свободное адресное пространство рядом с ними. Если бы вы знали априори, сколько адресного пространства зарезервировано, то вы, вероятно, не подумали бы называть realloc()
, в первую очередь, хотя!
Если вы играете в азартные игры на realloc()
, никогда не двигаясь, всегда растут, тогда у вас, вероятно, возникли большие проблемы, чтобы беспокоиться о любом случае, и переход на malloc()
+ copy + free()
не может решить этого.
Помимо "проверить правильное значение возвращаемого значения", наиболее интересным моментом из второй статьи является предупреждение о:
Не переустанавливайте буфер на 1 байт за раз.
они предупреждают:
Это гарантированно приведет к сбою памяти.
Это потенциально допустимая точка, но это не критика самого realloc()
; то же самое произойдет, если вы использовали malloc()
+ copy + free()
. Реальное решение заключается в том, чтобы вырастить буферы разумно, независимо от того, как вы их вырасти или лучше, но распределите в правильных размерах куски спереди.
Они также имеют точку в
Использование realloc для возврата памяти в систему.
Они верны здесь, поскольку использование любого размера, отличного от 0, может фактически не сделать возврат. Это, вероятно, делает вещи не хуже, но это использование по-прежнему кажется примером преждевременной "оптимизации". Исправление снова состоит в том, чтобы начать использовать разумные размеры.
Сортировка ответа: это небезопасно, но это не волшебное решение для всех ваших проблем.