Неправильная инициализация массивов при использовании инициализаторов
Этот дефект происходит, когда Polyspace® Bug Finder™ полагает, что инициализация массивов с помощью инициализаторов является неправильной.
Этот дефект применяется к нормальным и обозначенным инициализаторам. В C99, с обозначенными инициализаторами, можно поместить элементы инициализатора массивов в любом порядке и неявно инициализировать некоторые элементы массива. Обозначенные инициализаторы используют индекс массива, чтобы установить соответствие между элементом массива и элементом инициализатора массивов. Например, оператор int arr[6] = { [4] = 29, [2] = 15 }
эквивалентно int arr[6] = { 0, 0, 15, 0, 29, 0 }
.
Можно использовать инициализаторы неправильно одним из следующих способов.
Проблема | Риск | Возможная фиксация |
---|---|---|
В вашем инициализаторе для одномерного массива у вас есть больше элементов, чем размер массивов. | Неиспользованные элементы инициализатора массивов указывают на возможную ошибку кодирования. | Увеличьте размер массивов или удалите избыточные элементы. |
Вы помещаете фигурные скобки, заключающие значения инициализатора неправильно. | Из-за неправильного размещения фигурных скобок не используются некоторые элементы инициализатора массивов. Неиспользованные элементы инициализатора массивов указывают на возможную ошибку кодирования. | Поместите фигурные скобки правильно. |
В вашем обозначенном инициализаторе вы не инициализируете первый элемент массива явным образом. | Неявная инициализация первого элемента массива указывает на возможную ошибку кодирования. Вы возможно пропустили то, что индексация массива запускается от 0. | Инициализируйте все элементы явным образом. |
В вашем обозначенном инициализаторе вы инициализируете элемент дважды. | Первая инициализация заменена. Избыточная первая инициализация указывает на возможную ошибку кодирования. | Удалите избыточную инициализацию. |
Вы используете обозначенные и необозначенные инициализаторы в той же инициализации. | Вы или другой рецензент вашего кода не можете определить размер массива контролем. | Используйте или обозначенные или необозначенные инициализаторы. |
Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Polyspace Bug Finder.
Смотрите примеры мер ниже.
Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.
Группа: Программирование |
Язык: C | C++ |
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода |
Синтаксис командной строки: IMPROPER_ARRAY_INIT |
Удар: носитель |
ID CWE: 665 |