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

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

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