Переполнение буфера или ложное срабатывание? - PullRequest
2 голосов
/ 11 августа 2011

Функция getmodulefilenamew выдает ложное срабатывание (переполнение буфера), так как принимает в качестве буфера второй аргумент - фиксированного размера в нашем случае.

Но просматривая свою документацию: http://msdn.microsoft.com/en-us/library/ms683197%28v=vs.85%29.aspx

Цитата:Если буфер слишком мал для хранения имени модуля, строка усекается до символов nSize, включая завершающий нулевой символ, функция возвращает nSize, а функция устанавливает для последней ошибки значение ERROR_INSUFFICIENT_BUFFER.

Может кто-нибудь доверятьтретье лицо подтверждает или отклоняет эту проблему как ложно-положительную.Спасибо за вашу помощь!

===

HMODULE applicationModule = GetModuleHandleW(NULL);
WCHAR processName[MAX_PATH];
memset(processName, 0, sizeof(processName));
GetModuleFileNameW(applicationModule, processName, sizeof(processName));

===

Проблема связана с функцией GetModuleFileNameW

Сканирование предоставлено Veracodeстатический анализатор.

1 Ответ

2 голосов
/ 11 августа 2011

Ваша проблема в том, что вы передаете неправильное значение для nSize.Вы передаете количество байтов, но вы должны передать количество символов, MAX_PATH.Эти значения отличаются, потому что широкий символ имеет размер 2 байта.

Итак, да, в вашем коде есть ошибка.Если имя модуля достаточно длинное, Windows попытается записать до 520 символов в буфер, в котором есть место только для 260.

...