ПроблемаНеправильная инициализация массива происходит, когда Polyspace® Bug Finder™ считает, что инициализация массива с помощью инициализаторов неправильная.
Этот дефект относится к обычным и назначенным инициализаторам. В C99 с назначенными инициализаторами можно поместить элементы инициализатора массива в любой порядок и неявно инициализировать некоторые элементы массива. Назначенные инициализаторы используют индекс массива, чтобы установить соответствие между элементом массива и элементом инициализатора массива. Например, оператор int arr[6] = { [4] = 29, [2] = 15 } эквивалентно int arr[6] = { 0, 0, 15, 0, 29, 0 }.
Можно неправильно использовать инициализаторы одним из следующих способов.
| Проблема | Риск | Возможное исправление |
|---|
В инициализаторе для одномерного массива у вас больше элементов, чем размер массива. | Неиспользованные элементы инициализатора массива указывают на возможную ошибку кодирования. | Увеличьте размер массива или удалите лишние элементы. |
Вы помещаете скобки, содержащие значения инициализатора, неправильно. | Из-за неправильного размещения скобок некоторые элементы инициализатора массива не используются. Неиспользованные элементы инициализатора массива указывают на возможную ошибку кодирования. | Вставьте скобки правильно. |
В указанном инициализаторе вы не инициализируете явным образом первый элемент массива. | Неявная инициализация первого элемента массива указывает на возможную ошибку кодирования. Вы, возможно, упустили из виду тот факт, что индексация массива начинается с 0. | Инициализируйте все элементы явным образом. |
В указанном инициализаторе элемент инициализируется дважды. | Первая инициализация переопределена. Избыточная первая инициализация указывает на возможную ошибку кодирования. | Удалите избыточную инициализацию. |
Вы используете назначенные и незарегистрированные инициализаторы в одной и той же инициализации. | Вы или другой рецензент вашего кода не можете определить размер массива путем проверки. | Используйте назначенные или незарегистрированные инициализаторы. |
Пример - Неправильно размещенные скобки (только для C)
int arr[2][3]
= {{1, 2},
{3, 4},
{5, 6}
};
В этом примере массив arr инициализируется следующим {1,2,0,3,4,0}. Потому что инициализатор содержит {5,6}можно ожидать, что массив будет инициализирован {1,2,3,4,5,6}.
Коррекция - Правильно разместите скобкиОдной из возможных коррекций является правильное размещение скобок так, чтобы все элементы были явно инициализированы.
int a1[2][3]
= {{1, 2, 3},
{4, 5, 6}
};
Пример - Первый элемент не инициализирован явным образомint arr[5]
= {
[1] = 2,
[2] = 3,
[3] = 4,
[4] = 5
};
В этом примере arr[0] не инициализирован явным образом. Возможно, программист не посчитал, что индексация массива начинается с 0.
Коррекция - явная инициализация всех элементовОдной из возможных коррекций является явная инициализация всех элементов.
int arr[5]
= {
[0] = 1,
[1] = 2,
[2] = 3,
[3] = 4,
[4] = 5
};
Пример - Элемент инициализирован дваждыint arr[5]
= {
[0] = 1,
[1] = 2,
[2] = 3,
[2] = 4,
[4] = 5
};
В этом примере arr[2] инициализируется дважды. Первая инициализация переопределена. В данном случае, потому что arr[3] не был явно инициализирован, возможно, что программист намеревался инициализировать arr[3] когда arr[2] был инициализирован второй раз.
Коррекция - Исправление избыточной инициализацииОдной из возможных коррекций является устранение избыточной инициализации.
int arr[5]
= {
[0] = 1,
[1] = 2,
[2] = 3,
[3] = 4,
[4] = 5
};
Пример - Сочетание назначенных и незаявленных инициализаторовint arr[]
= {
[0] = 1,
[3] = 3,
4,
[5] = 5,
6
};
В этом примере, поскольку используется смесь назначенных и незаданных инициализаторов, трудно определить размер arr осмотром.
Коррекция - Используйте только назначенные инициализаторыОдной из возможных коррекций является использование только назначенных инициализаторов для инициализации массива и явное определение размера массива.
int arr[7]
= {
[0] = 1,
[3] = 3,
[4] = 4,
[5] = 5,
[6] = 6
};