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

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