(C6385) Чтение недопустимых данных из массива + Debug Error
Я пишу код для поиска простых чисел решетом Сундарама. Использовал Динамический массив. Из-за него и проблема, я считаю:
Также просто подсчитываю время его выполнения.
В конце выполнения программы вылезает ошибка:
Как понимать эти два предупреждения и Debug Error?
Ответы (1 шт):
По-моему, вы забыли, что в С/С++ нумерация элементов маассива начинается с 0.
Т.е. последний элемент в nums — n-й! Цикл должен иметь вид
Ну и соответственно, нужно проверить все прочие обращения к массиву. Я взял в качестве примера только самое первое.
Почему этот код генерирует предупреждения о переполнении буфера (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 c как исправить
The two-dimensional array M applies for N * (C + 1) size space, dimension is variable
However, the subscript is used in the actual operation to use N-2, and M [1] [C], so at least N> 2 is required.
Cancel the annotation of the first line, you can eliminate the C6385 warning
Intelligent Recommendation
c++ dynamic array
One,onArrayThere are several special places to pay attention to the use of: 1. One-dimensional array names can be used as pointers Specific application: parameter transfer of one-dimensional array/two.
C++ dynamic array
C99 supports a structure called variable length array to facilitate programmers. C++ also provides an array type whose length can be determined when the program is running: dynamic array. The declarat.
C++ generalized dynamic array
Generalized dynamic array The core idea of the dynamic array is to dynamically manage the memory occupied by the array elements when storing data, by calling the dynamic array class method to perfor.
C, dynamic array
Dynamic array, as the name implies, can determine the size of the array according to the input string. One-dimensional Two-dimensional array .
Предупреждение C6385 в Visual Studio
Кажется, я получаю ошибочное предупреждение от инструмента анализа кода Visual Studio 2019 (предварительная версия 16.5, но также и в 16.4 и более ранних). Это ошибка или я действительно чего-то упускаю?
Сгенерированное предупреждение (точно):
предупреждение C6385: Чтение недопустимых данных из ‘prodlist’: читаемый размер составляет ‘(size_t)*32+8′ байт, но можно прочитать ’64’ байта.
Вот код, который генерирует предупреждение (как можно меньше)
Если я изменю price_profile для int (и его соответствующее значение), или если я изменю num_rows к константе (например, 5 ) тогда предупреждение исчезнет.
1 ответ
Похоже, что в Visual Studio 2019 Microsoft по умолчанию применяет правила анализа SAL для кода C и C++, хотя по-прежнему существует множество ложных срабатываний, подобных вашему случаю.
На данный момент вы можете отключить предупреждение о ложном срабатывании: