ПроблемаНеправильная инициализация массива происходит, когда программа 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
};