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