gpt4 book ai didi

c - 防止结构中的字符指针溢出

转载 作者:行者123 更新时间:2023-11-30 17:03:22 25 4
gpt4 key购买 nike

我有一个函数,它接受包含敏感数据(在char数组中)的struct *指针作为参数(有点像一个小库)。两个struct模型如下:

struct struct1 {
char str[1024]; /* maybe even 4096 or 10KB+ */
size_t str_length;
}

struct struct2 {
char *str;
size_t str_length;
}

测试函数为:

/* Read str_length bytes from the char array. */
void foo(struct struct1/struct2 *s) {
int i;
for (i = 0; i < s->str_length; i++) {
printf("%c\n", s->str[i]);
}
}

我担心的是,由于 str_length 参数是一个任意值,因此有人可能会故意将其设置为导致缓冲区溢出(实际上有人愚蠢到故意在自己的程序中创建安全漏洞,但我觉得我必须考虑到这种情况)。然而,通过使用 struct1 模型,我可以简单地使用以下命令来检查可能的缓冲区溢出:

if (s->str_length > sizeof(s->str)) {
/* ERROR */
}

问题在于长度数组在编译时实际上是未知。所以我不知道是否使用 char * 指针(struct2 样式,因此没有溢出检查)或定义一个非常大的数组(struct1>),这会限制最大长度(我想避免的事情),并且在大多数情况下会分配不必要的空间(我想这在内存稀缺的嵌入式系统中可能会出现问题)。我知道我必须做出妥协,我个人会使用 struct2 模型,但我不确定这在安全方面是否是一个不错的选择。

最佳答案

您的库的用户从哪里获取要传递给函数的 struct2 实例?我不认为他自己创建它然后将其地址传递给你的函数,这将是一种奇怪的传递参数的方式。它很可能是从库中的另一个函数返回的,在这种情况下,您可以将 struct2 设为用户无法直接更改(或只能以黑客方式更改)的不透明数据类型:

/* in the header file */
typedef struct2_s struct2;

/* in the implementation file, where allocation is handled as well
* so you know str_length is set to the proper value.
*/
struct struct2_s {
char *str;
size_t str_length;
};

关于c - 防止结构中的字符指针溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36227847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com