exponenta event banner

MISRA C:2012 Dir 4.8

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

Описание

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

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

Объяснение

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

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

Внедрение Polyspace

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

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

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

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)++;
}

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

Группа: Дизайн кода
Категория: Консультационные услуги
СМЖЛ Категория: Консультативные услуги
Представлен в R2018a