ПроблемаПроблема возникает, когда указатель на структуру или объединение никогда не обособляется внутри единицы перевода, но реализация объекта не скрывается.
Если структура или объединение определены в файле или файле заголовка, включенном в файл, то указатель на эту структуру или объединение объявлен, но указатель никогда не обособлен в файле, средство проверки помечает нарушение правила кодирования. Определение структуры или объединения не должно быть видимым для этого файла.
При обнаружении нарушения этого правила в определении структуры определите, был ли определен указатель на структуру в том же файле или в файле заголовка, включенном в файл. Затем проверьте, нет ли ссылки на указатель в любом месте файла. Если не отменить привязку указателя, определение структуры должно быть скрыто из этого файла и включенных файлов заголовков.
file.hСодержит реализацию структуры.
#ifndef TYPE_GUARD
#define TYPE_GUARD
typedef struct {
int a;
} myStruct;
#endiffile.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;
#endiffile.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)++;
}