exponenta event banner

CERT C: Rec. DCL12-C

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

Описание

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

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

Внедрение Polyspace

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

Примеры

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

Проблема

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

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

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

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 и обособляет структуру.

#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 и обособляет структуру.

#include "file.h"

struct myStruct {                                               
  int a;                                                    
};

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

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

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

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

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