Я пытался искать сайт этот вопрос, но не нашел это точно, хотя эта тема затрагивается много...
У меня есть это объявление в cpp файле, не в любой функции:
static const char* gText = "xxxxxxxxxxx";
Хотя это имеет фиксированный размер, я получаю предупреждение от инструмента статического анализа (Klocwork), когда я пытаюсь скопировать его в другой символ* переменная - о возможном за пределы нарушение:
char xText[32];
SecureZeroMemory(xText, 32);
memcpy(xText, gText, strlen(gText));
Действительно ли это - положительная ложь, или глобальная переменная инициализирует позже?
Спасибо!
Это ложное срабатывание. strlen
, вероятно, абстрагирован как возвращающий неизвестное положительное число, так что при анализе паттерна memcpy(dest,src,strlen(src));
анализатор не понимает, что читающая часть копии безопасна, как только src
становится хорошо сформированной строкой.
Если бы вы использовали strcpy
, анализатор, вероятно, пришел бы к выводу, что в данном случае все в порядке. Есть ли у вас причина не делать этого? Функция strcpy
считается "небезопасной", но ваша memcpy(...,src,strlen(src))
тоже довольно небезопасна.
EDIT: Кроме того, sellibitze поднял очень хороший вопрос в комментариях: атрибут const
в оригинальном коде применяется только к символам, на которые указывает gText
, а не к самому gText
.
Я бы сказал, что это не ложное срабатывание. Существует потенциальный риск того, что кто-то может прийти и изменить длину gText, не осознавая, что он не может превышать 32 символа. Я бы определенно поставил какую-то проверку перед memcpy, чтобы убедиться, что не может быть переполнения буфера.
например.
char xText[32];
SecureZeroMemory(xText, 32);
size_t lenToCopy = MIN(strlen(gText), 32);
memcpy(xText, gText, lenToCopy);
Также я бы заменил магическое число 32 константой.