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