Warning C6385 in Visual Studio
I seem to get an erroneous warning message from Visual Studio 2019 (16.5 Preview but also in 16.4 and earlier) Code Analysis tool. Is this a bug, or am I really just missing something?
The warning generated (exactly) is:
warning C6385: Reading invalid data from ‘prodlist’: the readable size is ‘(size_t)*32+8′ bytes, but ’64’ bytes may be read.
Here’s the code which generates the warning (as minimal as possible)
If I change the price_profile to an int (and its corresponding value), or if I change num_rows to a constant (like 5 ) then the warning goes away.
Почему этот код генерирует предупреждения о переполнении буфера (C6385 / C6386) при анализе кода в Visual Studio 2012?
Я пытаюсь использовать функцию анализа кода в Visual Studio 2012. Я просто запустил их в моем существующем проекте и обнаружил некоторые предупреждения о переполнении буфера (C6385 /C6386 ) на части, которая содержит мою собственную реализацию вычитающего PRNG Кнута (он же RAN3). Тем не менее, я не могу понять, почему это происходит, потому что это выглядит хорошо (я не вижу вне чтения / записи). Поэтому я сделал короткий эквивалент (ниже) этой части, но все еще получил те же предупреждения и не могу выяснить причину их.
С кодом выше я получил предупреждение C6386 в строке 7 и C6385 в строке 9. Что не так с этим кодом? Я что-то пропустил?
Решение
g ++ 4.8 и clang ++ 3.3 компилируют это без предупреждения или ошибки (используя -Wall -Werror). На самом деле, мы можем использовать C ++ 11 std::array И его at метод проверки границ и
как вы и утверждали, не дает за пределами доступа. Я думаю, что ваш код в порядке. VS обеспокоен тем, что линия ((21U * i) % 55U) — 1U) может привести к 0 — 1 , который будет переполнен, потому что ii является неподписанным Int. Если вы используете целые, а не беззнаковые, жалуется ли VS?
(При использовании Python ваше отображение индекса выглядит нормально:
Не должно быть никаких недопустимых ошибок, тем более что вы не достигнете -1, используя неподписанные целые.)
Другие решения
выведите значение ii, посмотрите, выходит ли оно за пределы 54
Рассчитано по этой строке
без знака int ii = ((21U * i)% 55U) — 1U;
Прежде всего, пожалуйста, поймите цель статического анализа, он будет выполнять анализ базы кода, чтобы тщательно изучить и убедиться, что код соответствует их отраслевым стандартам. Это самый первый шаг в контроле качества программного обеспечения, который всегда помогает в динамическом анализе, чтобы найти тонкие проблемы и уязвимости, которые статический анализ не может найти. Fuzzing используется для обеспечения безопасности и качества программного обеспечения с помощью динамического анализа.
Статический анализ кода может также привести к ложному срабатыванию, который должен игнорировать аудитор кода. Ваш случай, о котором здесь сообщается, является ложной тревогой.
Теперь давайте углубимся в ваш сценарий, статический анализ обнаружит, что ваша инструкция ((21U * i)% 55U) МОЖЕТ закончить вычислением до нуля, что может привести к ii = -1; это может также привести к потенциальному сбою или даже использованию безопасности в вашем программном обеспечении (атака переполнения буфера). Статический анализ не будет выполнять все итерации цикла (в отличие от динамического анализа), чтобы утверждать, что каждая ветвь кода работает хорошо.
Теперь давайте поговорим о вашем коде, у меня есть несколько рекомендаций и улучшений для вас. Пожалуйста, введите некоторую константу или #define для хранения размера вашего массива.
Теперь вместо использования жестко закодированных чисел «55» и «54» начните использовать _SIZE в своем коде. Вы можете ввести функцию полезности, чтобы получить безопасные границы для массива.
Почему этот код генерирует предупреждения о переполнении буфера (C6385 / C6386) при анализе кода в Visual Studio 2012?
Я пытаюсь использовать функцию анализа кода в Visual Studio 2012. Я просто запустил их поверх моего существующего проекта и обнаружил предупреждения о переполнении буфера (C6385/C6386) в той части, которая содержит мою собственную реализацию субтрактивного PRNG (или RAN3), Тем не менее, я не могу понять, почему это происходит, потому что это выглядит нормально (я не вижу никаких ошибок чтения/записи). Поэтому я сделал короткий эквивалент (ниже) этой части, но все же получил те же предупреждения и не могу понять причину их.
С приведенным выше кодом я получил предупреждение C6386 в строке 7 и C6385 в строке 9. Что случилось с этим кодом? Я что-то упускаю?
3 ответа
g++ 4.8 и клан g++ 3.3 скомпилируйте это без предупреждения или ошибки (используя -Wall -Werror). На самом деле, мы можем использовать С++ 11 std::array и его at методе, чтобы получить проверку границ, и
как вы утверждали, не дает доступа за пределы границ. Я думаю, что ваш код в порядке. VS обеспокоен тем, что строка ((21U * i) % 55U) — 1U) может привести к 0 — 1 , которая будет переполняться, потому что ii является неподписанным int. Если вы используете ints вместо unsigned ints, VS все еще жалуется?
(Используя Python, ваше сопоставление индексов кажется прекрасным:
Не должно быть ошибок вне границ, тем более, что вы не достигнете -1, используя unsigned ints.)
Прежде всего, пожалуйста, поймите цель Статического анализа, он проведет анализ базы кода, чтобы тщательно изучить и убедиться, что код соответствует отраслевым стандартам. Это первый шаг в управлении качеством программного обеспечения и всегда помогает динамическому анализу, чтобы найти тонкие проблемы и уязвимости, которые статический анализ не может найти. Fuzzing используется для обеспечения безопасности и качества программного обеспечения при динамическом анализе.
Анализ статического кода может также привести к ложному положительному результату, который должен игнорировать аудитор кода. Ваше дело, представленное здесь, является ложным сигналом тревоги.
Теперь давайте окунемся в ваш сценарий, статический анализ обнаруживает, что ваша команда ((21U * i)% 55U) МОЖЕТ в конечном итоге оценивать до нуля, что может привести к тому, что ii = -1; это может привести к потенциальному сбою или даже к безопасности в вашем программном обеспечении (переполнение буфера). Статический анализ не будет выполнять все итерации цикла (в отличие от динамического анализа), чтобы утверждать, что каждая ветвь кода выполняется хорошо.
Теперь давайте поговорим о вашем коде, у меня есть некоторые рекомендации и улучшения для вас. Пожалуйста, введите константу или #define, чтобы сохранить размер вашего массива.
Теперь вместо использования жестко закодированных номеров «55» и «54» начните использовать _SIZE в вашем коде. Вы можете ввести функцию утилиты, чтобы получить безопасные границы для массива.
Получение предупреждения C6385 при попытке использовать функцию
Я получаю это предупреждение, если попытаюсь использовать функцию geti() в следующем коде.
Но если я использую целое число как
прямо тогда я не могу получить предупреждение. Я не могу понять сценарий, что происходит там, я много искал его, но не смог найти решение. Я новичок в c++, прошу простить меня за ошибку заклинания и, пожалуйста, помогите мне понять это.
Примечание. Я создаю код с помощью рекомендуемых правил Microsoft Mixed (c++/CLR).