gpt4 book ai didi

c - 为什么 C11 标准不会删除不安全的 strcat(),strcpy() 函数?

转载 作者:行者123 更新时间:2023-12-01 13:46:50 31 4
gpt4 key购买 nike

C11 & C++14标准下降了gets()本质上不安全的函数会导致安全问题,因为它不执行边界检查会导致缓冲区溢出。那为什么C11标准不降strcat() & strcpy()职能? strcat()函数不检查第二个字符串是否适合第一个数组。 strcpy()函数也不包含检查目标数组边界的规定。如果源数组的字符多于目标数组可以容纳的字符怎么办?很可能程序会在运行时崩溃。

那么,如果这两个不安全的函数完全从语言中删除不是很好吗?为什么它们还存在?是什么原因?只有像 strncat(),strncpy() 这样的函数不是很好吗? ?如果我没记错 Microsoft C & C++ 编译器提供了这些函数的安全版本 strcpy_s(),strcat_s() .那么为什么其他 C 编译器没有正式实现它们以提供安全性呢?

最佳答案

gets()本质上是不安全的,因为如果在 stdin 上接收到太多数据,它通常会溢出目标。 .这个:

char s[MANY];
gets(s);

如果超过 MANY 将导致未定义的行为字符被输入,并且程序通常无法阻止它。
strcpy()strcat()可以完全安全地使用,因为只有当源字符串太长而无法包含在目标数组中时,它们才会溢出目标。源字符串包含在受程序本身控制的数组对象中,不受任何外部输入的控制。例如,这个:
char s[100];
strcpy(s, "hello");
strcat(s, ", ");
strcat(s, "world");

除非程序本身被修改,否则不可能溢出。
strncat()可以用作 strcat() 的更安全版本-- 只要您正确指定了第三个参数。 strncat() 的一个问题是它只为您提供一种处理目标数组中没有足够空间的情况的方法:它默默地截断字符串。有时这可能是您想要的,但有时您可能想要检测溢出并对其采取措施。

至于 strncpy() ,它不仅仅是 strcpy() 的更安全版本.它本质上并不危险,但如果你不是很小心,你可以很容易地离开目标数组而不用终止 '\0' null 字符,导致下次将其传递给需要指向字符串的指针的函数时出现未定义的行为。碰巧, I've written about this .

关于c - 为什么 C11 标准不会删除不安全的 strcat(),strcpy() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30883029/

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