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 Desktop.

См. примеры исправлений ниже.

Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты 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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: IMPROPER_ARRAY_INIT
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 665
Введенный в R2015b