Не случайно, что неопределенные строки не вызывают проблем в небольших программах.
В большинстве ОС / процессоров malloc округляет выделения до кратных 4 или 8 байт (в зависимости от требований выравнивания памяти)процессора), поэтому часто (но не всегда) несколько свободных байтов находятся в конце строки.
Обычно, когда malloc требует больше памяти, она выделяется одной или нескольким виртуальным страницам (обычно 4 КБ)ОПЕРАЦИОННЫЕ СИСТЕМЫ.По соображениям безопасности страницы должны быть стерты, если они в последний раз использовались другим процессом (или не использовались после «горячего» сброса?).
Поэтому, потому что есть много нулей (оба в выделенномобласть и только что последующие) есть хороший шанс, что не завершенные строки не вызовут проблемы при запуске или в небольших, коротко работающих программах (что по иронии судьбы включает в себя большинство тестовых программ), но появятся позже, когда malloc повторно использует освобожденные блоки.
Для защиты от этого класса проблем при разработке и тестировании необходимо использовать что-то вроде efence с опцией EF_FILL, чтобы установить для памяти malloc'd ненулевое значение.
Точно так же этоПолезная идея инициализировать стек ненулевыми значениями, так как - на большинстве машин с ВМ - стек создается из 4 тыс. страниц, которые стираются перед выделением процессу.
Обратите внимание, что даже при использовании таких вещей, как efence, существуетпо-прежнему проблема со статическими переменными - вся область стирается до нуляПрограмма загружена (и снова данные выровнены), поэтому неопределенная строка, вероятно, останется незамеченной, если статическая строковая переменная будет записана только один раз - проблема будет замечена, только если строковая переменная используется повторно для хранения более короткой неопределенной строки.
Что касается смежной проблемы, то выравнивание переменных объясняет, почему не выделяется достаточно места для завершающего NUL строки часто остается незамеченным.