CERT C: Rule ARR36-C

Не вычитайте или сравните два указателя, которые не ссылаются на один и тот же массив

Описание

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

Не вычитайте и не сравните два указателя, которые не ссылаются на один и тот же массив.[1]

Реализация Polyspace

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

Примеры

расширить все

Проблема

Вычитание или сравнение между указателями на различные массивы происходит, когда вы вычитаете или сравниваете указатели, которые имеют значение null или которые указывают на элементы в разных массивах. Реляционные операторы для сравнения >, <, >=, и <=.

Риск

Когда вы вычитаете два указателя на элементы в одном массиве, результатом является различие между нижними индексами двух элементов массива. Точно так же, когда вы сравниваете два указателя с элементами массива, результатом являются положения указателей относительно друг друга. Если указатели имеют значение null или указывают на различные массивы, операция вычитания или сравнения не определена. Если вы используете результат вычитания как индекс буфера, это может вызвать переполнение буфера.

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

Прежде чем вы вычитаете или используете реляционные операторы, чтобы сравнить указатели на элементы массива, проверяйте, что они не имеют значения null и что они указывают на один и тот же массив.

Пример - Вычитание между указателями на элементы в разных массивах
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE20 20

size_t func(void)
{
    int nums[SIZE20];
    int end;
    int *next_num_ptr = nums;
    size_t free_elements;
	/* Increment next_num_ptr as array fills */
	
	/* Subtraction operation is undefined unless array nums 
	is adjacent to variable end in memory. */
    free_elements = &end - next_num_ptr; 
    return free_elements;
}
    
      

В этом примере массив nums постепенно заполняется. Вычитание указателя затем используется, чтобы определить, сколько свободных элементов остается. Если только end указывает на место памяти один за последним элементом numsоперация вычитания не определена.

Коррекция - вычитание указателей на тот же массив

Вычесть указатель на последний элемент, который был заполнен, из указателя на последний элемент массива.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE20 20

size_t func(void)
{
    int nums[SIZE20];
    int *next_num_ptr = nums;
    size_t free_elements;
	/* Increment next_num_ptr as array fills */
	
	/* Subtraction operation involves pointers to the same array. */
    free_elements = &(nums[SIZE20 - 1]) - next_num_ptr;  
	
    return free_elements + 1;
}
     

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

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

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

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