C6385 c как исправить
Перейти к содержимому

C6385 c как исправить

  • автор:

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).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *