c - 检测 C 中的结构字段访问

标签 c parsing code-analysis c99 static-code-analysis

我想强制某个结构永远不会直接访问它的字段,总是使用结构函数。

例子:

struct NoOutsideAccess { int field1;}
struct example {NoOutsideAccess f1;}

NoOutsideAccess noa;
example * ex;

&noa          // OK
&ex->noa      // OK
noa.field1;   // ERROR
ex->f1.field1 // ERROR

我看过 C 语言解析器和分析工具,但我不确定我是否可以用它们来做到这一点。

我不想更改结构,因为它的字段将直接在其他模块中使用。在这种情况下,我需要一些脚本来指出它的使用位置,以便不应该更改它的模块可以更改它。

但我确实找到了 duplicate ,不确定是否会匹配所有用法,但会试一试。

最佳答案

在 C 中创建不透明对象的一种方法是将定义隐藏在 C 文件中,并且只导出访问器原型(prototype)以及头文件中对象的前向声明:

/* foo.h */

struct foo; /* forward declaration */

struct foo *foo_new (int bar, const char *baz);
void        foo_free(struct foo *foo);

int         foo_get_bar(struct foo *foo);
const char *foo_get_baz(struct foo *foo);

然后执行:

/* foo.c */

struct foo {
    int bar;
    const char *baz;
};

/* implementations of foo_{new,free,get_bar,get_baz} */

注意:由于外部代码不知道 struct foo 的大小,因此您只能使用指向那里的 foo 的指针(这就是 foo_new 进来了)。

关于c - 检测 C 中的结构字段访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51990196/

相关文章:

code-analysis - 您使用什么重复检测阈值?

java - 将 json 日期解析为特定日期格式

azure - 为什么我的构建管道突然失败并出现代码分析错误?

c++ - C++ 中作为参数的不同类型的函数

c - 产生荒谬的输出

python - 无法在字符串中找到字符?

python组合每对行: making script more efficient

code-analysis - 了解代码指标

c - GDB 函数参数条件中断

c - 指针运动。为什么数字这么高?为什么它以 block 而不是恒定流的形式打印信息?