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