exponenta event banner

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

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

Описание

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

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

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

ПроблемаРискВозможное исправление

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

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

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

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

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

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

Правильно разместите раскосы.

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

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

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

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

Первая инициализация переопределена.

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

Удалите резервную инициализацию.

В одной инициализации используются назначенные и неназначенные инициализаторы.

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

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

Зафиксировать

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

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

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

Примеры

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


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
Воздействие: среднее
ИДЕНТИФИКАТОР CWE: 665
Представлен в R2015b