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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Группа: Рек. 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 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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