我有一个函数,它接受包含敏感数据(在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模型,但我不确定这是否是一个安全明智的选择。
如果你想有一个填充阶段教练与全功能的范围检查,你应该明确不使用C.如果用户改变了实例的指针? – Olaf
习惯于此在结构的最后定义一个绝对巨大的数组以供您的lib使用,并让用户管理它的实际分配并传递一个指针和“实际”大小。您保持灵活性,不会浪费实际空间。当然,你不能直接拷贝结构体! –
安全?这是C - 你已经没有安全:) –