保护不透明数据类型中的数据

Posted

技术标签:

【中文标题】保护不透明数据类型中的数据【英文标题】:Protecting the data in opaque data types 【发布时间】:2021-12-09 23:26:54 【问题描述】:

我正在用 C 语言制作一个数据结构库,我决定让数据结构不透明,所以我有一个标题 lew_arr.h

struct lew_arr;

以及带有定义的源文件lew_arr.c

struct lew_arr 
    void *buff; 
    size_t len; //number of elements in the array 
    size_t cap; //capacity of the array
    size_t sz; //number of bytes for each element
;

这里还有一个函数的定义,它为新的 lew_arr 结构分配内存,初始化它,并通过 out 参数返回它

lew_err lew_arr_init(size_t const cap, size_t const sz, struct lew_arr **out_arr);

由于header中没有定义结构,用户无法访问成员;但是,他们可以通过这样的指针更改数据:

int main(void)

    struct lew_arr *a;
    lew_arr_init(10, sizeof(int), &a);
    
    char *ptr = (void *) a;
    *ptr++ = 1;
    *ptr++ = 2;
    //etc.
    return 0;
 

我知道这会玩火,因为用户不知道他们正在改变什么,但是有没有办法阻止用户这样做,或者这只是 C 中你必须信任的事情之一程序员知道他们在做什么?

【问题讨论】:

C 可以(有时)保护您免受错误,而不是故意滥用。 【参考方案1】:

the principles of C programming language 之一是“相信程序员”。虽然这个目标“在安全和安全编程社区方面已经过时”,但它仍然是 C 编程语言的精神。

有没有办法阻止用户这样做,

没有。

或者这只是 C 语言中你必须相信程序员知道他们在做什么的事情之一?

你必须“让”他们去做。

我希望您不必真的“信任”他们,因为其他程序员将在他们的计算机上工作,而不是您的计算机,因此您的计算机应该是安全的。

【讨论】:

以上是关于保护不透明数据类型中的数据的主要内容,如果未能解决你的问题,请参考以下文章

静态分配不透明数据类型

对类型化数组的理解

无法让嵌套类型保护与打字稿中的联合类型一起使用

高级数据类型---元祖[tuple]

Laravel 的 ORM 返回的数据类型小结

包中声明的类型的实例在编译调试后是不透明的