ПроблемаПроблема возникает, когда указатель на структуру или объединение никогда не разменяется в модуле преобразования, но реализация объекта не скрыта.
Если структура или объединение определены в файле или заголовочном файле, включенном в файл, объявлен указатель на эту структуру или объединение, но указатель никогда не выдавался из файла, то проверяющая машина помечает нарушение правил кодирования. Определение структуры или объединения не должно быть видимым для этого файла.
Если вы видите нарушение этого правила в определении структуры, идентифицируете, определили ли вы указатель на структуру в том же файле или в заголовочном файле, включенном в файл. Затем проверьте, не высмеиваете ли вы указатель в любом месте файла. Если вы не отдаете предпочтение указателю, определение структуры должно быть скрыто от этого файла и включенных заголовочных файлов.
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)++;
}
РискЕсли указатель на структуру или объединение не разыменован в файле, детали реализации структуры или объединения не должны быть доступны в модуле преобразования для файла. Можно скрыть детали реализации, такие как представители структуры, и защитить их от непреднамеренных изменений.
Задайте непрозрачный тип, на который можно ссылаться с помощью указателей, но к содержимому которого невозможно получить доступ.
Пример - Раскрыта реализация объекта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)++;
}