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