CERT C: Rec. DCL12-C

Реализуйте абстрактные типы данных с использованием непрозрачных типов

Описание

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

Реализуйте абстрактные типы данных с использованием непрозрачных типов.[1]

Реализация Polyspace

Эта проверка проверяет реализацию объекта Structure или объединение, видимую в файле, где указатель на этот объект не разыменован.

Примеры

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

Проблема

Проблема возникает, когда указатель на структуру или объединение никогда не разменяется в модуле преобразования, но реализация объекта не скрыта.

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

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

file.h: Содержит реализацию структуры.

#ifndef TYPE_GUARD
#define TYPE_GUARD

typedef struct  {                                               
  int a;                                                    
} myStruct; 

#endif

file.c: Включает в себя file.h но не дереферентная структура.

#include "file.h"

myStruct* getObj(void);
void useObj(myStruct*);

void func() {
  myStruct *sPtr = getObj();
  useObj(sPtr);
}

В этом примере указатель на тип myStruct не дезефицируется. Указатель просто получен из getObj функцию и передали в useObj функция.

Реализация myStruct виден в модуле перевода, состоящей из file.c и file.h.

Одной из возможных коррекций является определение непрозрачного типа данных в заголовочном файле file.h. Непрозрачный тип данных ptrMyStruct точки на myStruct структура, не раскрывая, что содержит структура. Структура myStruct сам может быть определен в отдельном модуле перевода, в этом случае состоящей из файла file2.c. Общий файл заголовка file.h должны быть включены в обе file.c и file2.c для связи определения структуры с описанием непрозрачного типа.

file.h: Не содержит реализации структуры.

#ifndef TYPE_GUARD
#define TYPE_GUARD

typedef struct myStruct *ptrMyStruct; 

ptrMyStruct getObj(void);
void useObj(ptrMyStruct);

#endif

file.c: Включает file.h но не дереферентная структура.

#include "file.h"

void func() {
  ptrMyStruct sPtr = getObj();
  useObj(sPtr);
}

file2.c: Включает file.h и структура dereferences.

#include "file.h"

struct myStruct {                                               
  int a;                                                    
};

void useObj(ptrMyStruct ptr) {
    (ptr->a)++;
}

Риск

Если указатель на структуру или объединение не разыменован в файле, детали реализации структуры или объединения не должны быть доступны в модуле преобразования для файла. Можно скрыть детали реализации, такие как представители структуры, и защитить их от непреднамеренных изменений.

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

Пример - Раскрыта реализация объекта

file.h: Содержит реализацию структуры.

#ifndef TYPE_GUARD
#define TYPE_GUARD

typedef struct  {                                               
  int a;                                                    
} myStruct; 

#endif

file.c: Включает file.h но не дереферентная структура.

#include "file.h"

myStruct* getObj(void);
void useObj(myStruct*);

void func() {
  myStruct *sPtr = getObj();
  useObj(sPtr);
}

В этом примере указатель на тип myStruct не дезефицируется. Указатель просто получен из getObj функцию и передали в useObj функция.

Реализация myStruct виден в модуле перевода, состоящей из file.c и file.h.

Коррекция - задайте непрозрачный тип

Одной из возможных коррекций является определение непрозрачного типа данных в заголовочном файле file.h. Непрозрачный тип данных ptrMyStruct точки на myStruct структура, не раскрывая, что содержит структура. Структура myStruct сам может быть определен в отдельном модуле перевода, в этом случае состоящей из файла file2.c. Общий файл заголовка file.h должны быть включены в обе file.c и file2.c для связи определения структуры с описанием непрозрачного типа.

file.h: Не содержит реализации структуры.

#ifndef TYPE_GUARD
#define TYPE_GUARD

typedef struct myStruct *ptrMyStruct; 

ptrMyStruct getObj(void);
void useObj(ptrMyStruct);

#endif

file.c: Включает в себя file.h но не дереферентная структура.

#include "file.h"

void func() {
  ptrMyStruct sPtr = getObj();
  useObj(sPtr);
}

file2.c: Включает в себя file.h и структура dereferences.

#include "file.h"

struct myStruct {                                               
  int a;                                                    
};

void useObj(ptrMyStruct ptr) {
    (ptr->a)++;
}

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

Группа: Рек. 02. Объявления и инициализация (DCL)
Введенный в R2019a

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

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

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