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 и структура dereferences.

#include "file.h"

struct myStruct {                                               
  int a;                                                    
};

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

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

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