gpt4 book ai didi

c - C 中的空终止错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:05 26 4
gpt4 key购买 nike

我正在阅读 Robert C Seaford 撰写的《用 C 和 C++ 编写安全编码》一书。

int main(int argv, char* argv[]) {
char a[16];
char b[16];
char c[32];

strcpy(a, "0123456789abcdef");
strcpy(b, "0123456789abcdef");
strcpy(c, a);
strcat(c, b);
printf("a = %s\n", a);
retrun 0;
}

三个字符数组的静态声明无法为空终止字符分配存储。

结果,第一个 strcpy() 在数组末尾之外写入了一个空字符。

根据编译器分配存储的方式,这个空字节可能会被下一行的 strcpy() 覆盖。如果发生这种情况,a 现在指向一个包含 20 个字符的数组,而 b 指向一个包含 10 个字符的数组。

我的问题是作者的意思是数组 a 包含 20 个字符而数组 b 指向 10 个字符?

最佳答案

我必须假设“10”指的是十六进制 0x10 (16),而“20”指的是十六进制 0x20 (32)。

无论如何,关键是字符串操作代码根据空字符的位置而不是数组中实际分配的字符数来确定字符串的长度。如果这样分配内存:

<-------a------><-------b------><--------------c-------------->

然后在第一个 strcpy 之后,内存看起来像这样。 (我将使用 ! 来表示 null)。

<-------a------><-------b------><--------------c-------------->
0123456789abcdef!

然后在第二个 strcpy 之后,内存看起来像这样。

<-------a------><-------b------><--------------c-------------->
0123456789abcdef0123456789abcdef!

每个 strcpy 操作都会溢出它应该写入的数组并使用相邻的内存,这是一种非常糟糕的做法。任何像字符串一样操作 a 的函数都会看到 32 (0x20) 个字符(不计算空值),任何像字符串一样操作 b 的函数都会看到 16 (0x10) 个字符(不包括空值)- 尽管您在每个数组中只分配了足够的内存用于 15 个字符(不包括空值)。

任何一个都不会崩溃的事实是内存布局的意外。如果您向数组中写入的字符多于可用空间,并且正在写入的相邻内存不可写,那么您将会崩溃。

当然,由于您正在阅读有关安全编码的内容,因此您正在覆盖其他内容这一事实可能是一个严重的安全问题,具体取决于输入的可信度以及被覆盖的内容。

关于c - C 中的空终止错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15924451/

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