Когда глобальные статические переменные константы инициализируют?

Я пытался искать сайт этот вопрос, но не нашел это точно, хотя эта тема затрагивается много...

У меня есть это объявление в cpp файле, не в любой функции:

static const char* gText = "xxxxxxxxxxx";

Хотя это имеет фиксированный размер, я получаю предупреждение от инструмента статического анализа (Klocwork), когда я пытаюсь скопировать его в другой символ* переменная - о возможном за пределы нарушение:

char xText[32];
SecureZeroMemory(xText, 32);
memcpy(xText, gText, strlen(gText));

Действительно ли это - положительная ложь, или глобальная переменная инициализирует позже?

Спасибо!

11
задан IUnknownPointer 21 June 2010 в 09:42
поделиться

2 ответа

Это ложное срабатывание. strlen, вероятно, абстрагирован как возвращающий неизвестное положительное число, так что при анализе паттерна memcpy(dest,src,strlen(src)); анализатор не понимает, что читающая часть копии безопасна, как только src становится хорошо сформированной строкой.

Если бы вы использовали strcpy, анализатор, вероятно, пришел бы к выводу, что в данном случае все в порядке. Есть ли у вас причина не делать этого? Функция strcpy считается "небезопасной", но ваша memcpy(...,src,strlen(src)) тоже довольно небезопасна.

EDIT: Кроме того, sellibitze поднял очень хороший вопрос в комментариях: атрибут const в оригинальном коде применяется только к символам, на которые указывает gText, а не к самому gText.

1
ответ дан 3 December 2019 в 12:17
поделиться

Я бы сказал, что это не ложное срабатывание. Существует потенциальный риск того, что кто-то может прийти и изменить длину gText, не осознавая, что он не может превышать 32 символа. Я бы определенно поставил какую-то проверку перед memcpy, чтобы убедиться, что не может быть переполнения буфера.

например.

char xText[32];
SecureZeroMemory(xText, 32);
size_t lenToCopy = MIN(strlen(gText), 32);
memcpy(xText, gText, lenToCopy);

Также я бы заменил магическое число 32 константой.

1
ответ дан 3 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: