передача (size_t) -1 в snprintf_s - PullRequest
0 голосов
/ 14 сентября 2018

Вопрос о C ++ Stackwalker здесь: https://github.com/JochenKalmbach/StackWalker

#define _TRUNCATE ((size_t)-1)

enum
{
    STACKWALK_MAX_NAMELEN = 1024
}; 

void StackWalker::OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName)
{
    CHAR   buffer[STACKWALK_MAX_NAMELEN];
    size_t maxLen = STACKWALK_MAX_NAMELEN;
#if _MSC_VER >= 1400
    maxLen = _TRUNCATE;
#endif
    _snprintf_s(buffer, maxLen, "SymInit: Symbol-SearchPath: '%s', symOptions: %d, UserName: '%s'\n",
        szSearchPath, symOptions, szUserName);
}

maxlen сначала устанавливается на 1024, а затем, если версия VC ++> = 1400 (что это), то он устанавливается на (без знака)-1, другими словами, по крайней мере, UINT_MAX.

Затем maxlen передается в _snprintf_s, поэтому он вызывает переполнение буфера, если строка больше 1024 символов.

Я что-то пропустилВот?Что могло послужить причиной установки maxlen на UINT_MAX?Использование функции безопасной строки, но без безопасности?

1 Ответ

0 голосов
/ 14 сентября 2018

Эта перегрузка для _snprintf_s (особая функция Visual Studio) может использоваться только в C ++, если длина буфера может быть определена из первого аргумента.

См. Второй абзац под Remarks в документации для описания магического значения _TRUNCATE и его действия.

Но обратите внимание, что для более ранних версий VS код реализует эту функцию, используя _snprintf, который ничего не знает о макросе _TRUNCATE:

#if _MSC_VER < 1400
// ...
#define _snprintf_s _snprintf

Чтобы иметь возможность использовать _snprintf, он должен организовать передачу длины буфера. snprintf не имеет шаблонной перегрузки, которая может определить длину аргументов символьного буфера. Кроме того, ему нужно #define _TRUNCATE, потому что в тех же старых версиях его нет в stdlib.h.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...