Даже Если Функция Ничего Не Делает, Вызывайте Ее, Когда Этого Требует Документация, Потому Что Завтра Она Может Что-То Сделать.

Если в документации сказано, что вы должны вызвать функцию, то вы должны это сделать.

Функция может ничего не делать, но это не значит, что она не будет ничего делать в будущем.

Сегодняшним примером является функция GetEnvironmentStrings, которая возвращает все переменные среды текущего процесса в одном блоке, чтобы вы могли изучить их на досуге.

Когда вы закончите с этим, предполагается, что вы используете FreeEnvironmentStrings. В документации так написано, и если вы это сделаете, то все в порядке ( ты в хорошей форме ).

Однако некоторые заметили, что в Windows NT4 версия FreeEnvironmentStrings для Unicode ничего не делает. Другими словами, блок переменных среды Unicode удалять не нужно.

Когда вы вызываете GetEnvironmentStrings, ядро просто возвращает прямой указатель на фактические переменные среды (которые, поскольку это Windows NT, хранятся в Unicode).

Поскольку ничего не выбрано, ничего удалять не нужно.

Проблема в том, что если кто-то тем временем вызовет SetEnvironmentVariable, блок переменных среды изменится прямо в руках того, кто вызвал GetEnvironmentStrings. Упс.

Чтобы исправить это ( в комментариях Рэймонд Чен пишет, что это было сделано в Windows Vista - Л.

Ц.

), функция GetEnvironmentStrings была изменена и теперь возвращает копию блока переменных среды даже при вызове версии Unicode. Соответствующая функция FreeEnvironmentStrings удаляет эту копию.

Программы, которые следуют спецификации и вызывают FreeEnvironmentStrings (даже если эта функция раньше ничего не делала), подходят. Вызов FreeEnvironmentStrings теперь освобождает память, и все в порядке.

Программы, созданные в соответствии с реализацией, а не со спецификацией, сейчас находятся в мире боли.

Если они просто пропустят «бесполезный» вызов FreeEnvironmentStrings, произойдет утечка памяти.

С другой стороны, если бы они вызвали FreeEnvironmentStrings, но по-прежнему использовали бы блок окружения, в конечном итоге они получили бы доступ не к тому месту в куче и весь хаос, который мог бы из-за этого возникнуть.

Для правил, которые на первый взгляд кажутся глупыми, всегда есть какая-то причина.

(«Вызовите эту функцию, которая ничего не делает»).

Изменения в реализации могут сделать их менее глупыми в будущем.

(Спасибо моему коллеге Нилу Клифту за информацию, которая легла в основу сегодняшней статьи) Рэймонд Чен — известный разработчик команды Windows Shell. В Microsoft с 1992 года работал над OS/2, Windows 95, DirectX и последними версиями Windows. Он известен своим блогом The Old New Thing, в котором рассказывается об истории программирования для Windows с упором на обратную совместимость.

UPD: Переехал в новый коллективный блог.

Спасибо за карму! Теги: #старая обновка #Windows #winapi #Разработка для Windows

Вместе с данным постом часто просматривают: