CERT C: Rule ARR36-C

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

Описание

Управляйте определением

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

Примеры

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

Описание

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

Риск

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

Фиксация

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

Пример - вычитание между указателями на элементы в различных массивах

#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 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

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