Когда инициализируются глобальные статические переменные const? - PullRequest
11 голосов
/ 21 июня 2010

Я пытался найти этот вопрос на сайте, но не нашел его точно, хотя этот вопрос много обсуждается ...

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

static const char* gText = "xxxxxxxxxxx";

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

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

Это ложное срабатывание или глобальная переменная инициализируется позже?

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 июня 2010

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

, например

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

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

1 голос
/ 21 июня 2010

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

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

РЕДАКТИРОВАТЬ: Кроме того, sellibitze поднимает очень хороший момент в комментариях: атрибут const только в исходном кодеприменяется к символам, указанным gText, а не к gText.

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