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