Improper array initialization

Неправильная инициализация массивов при использовании инициализаторов

Описание

Этот дефект происходит, когда Polyspace® Bug Finder™ полагает, что инициализация массивов с помощью инициализаторов является неправильной.

Этот дефект применяется к нормальным и обозначенным инициализаторам. В C99, с обозначенными инициализаторами, можно поместить элементы инициализатора массивов в любом порядке и неявно инициализировать некоторые элементы массива. Обозначенные инициализаторы используют индекс массива, чтобы установить соответствие между элементом массива и элементом инициализатора массивов. Например, оператор int arr[6] = { [4] = 29, [2] = 15 } эквивалентно int arr[6] = { 0, 0, 15, 0, 29, 0 }.

Можно использовать инициализаторы неправильно одним из следующих способов.

ПроблемаРискВозможная фиксация

В вашем инициализаторе для одномерного массива у вас есть больше элементов, чем размер массивов.

Неиспользованные элементы инициализатора массивов указывают на возможную ошибку кодирования.

Увеличьте размер массивов или удалите избыточные элементы.

Вы помещаете фигурные скобки, заключающие значения инициализатора неправильно.

Из-за неправильного размещения фигурных скобок не используются некоторые элементы инициализатора массивов.

Неиспользованные элементы инициализатора массивов указывают на возможную ошибку кодирования.

Поместите фигурные скобки правильно.

В вашем обозначенном инициализаторе вы не инициализируете первый элемент массива явным образом.

Неявная инициализация первого элемента массива указывает на возможную ошибку кодирования. Вы возможно пропустили то, что индексация массива запускается от 0.

Инициализируйте все элементы явным образом.

В вашем обозначенном инициализаторе вы инициализируете элемент дважды.

Первая инициализация заменена.

Избыточная первая инициализация указывает на возможную ошибку кодирования.

Удалите избыточную инициализацию.

Вы используете обозначенные и необозначенные инициализаторы в той же инициализации.

Вы или другой рецензент вашего кода не можете определить размер массива контролем.

Используйте или обозначенные или необозначенные инициализаторы.

Фиксация

Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Bug Finder в Пользовательском интерфейсе Рабочего стола Polyspace.

Смотрите примеры мер ниже.

Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.

Примеры

развернуть все


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[]
= {
    [0] = 1,
    [3] = 3,
    [4] = 4,
    [5] = 5,
    [6] = 6
};              

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: IMPROPER_ARRAY_INIT
Удар: Средняя
ID CWE: 665
Введенный в R2015b