exponenta event banner

CERT C: Rec. ARR02-C

Явно указать границы массива, даже если они неявно определены инициализатором

Описание

Определение правила

Явно укажите границы массива, даже если они неявно определены инициализатором. [1 ]

Внедрение Polyspace

Эта проверка проверяет наличие проблемы Неправильная инициализация массива.

Примеры

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

Проблема

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример - Неправильно размещенные раскосы (только 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
};              

Проверить информацию

Группа: Rec. 06. Массивы (ARR)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.