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