CERT C: Rec. DCL12-C

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

Описание

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

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

Примеры

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

Описание

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

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

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

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 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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