使用gets 防止缓冲区溢出

gets的声明是:

 char * gets ( char * str ); 

请注意str的最大尺寸的明显遗漏

cplusplus.com说2

请注意,gets与fgets完全不同:不仅使用stdin作为源,而且它不包括结果字符串中的结束换行符,并且不允许指定str的最大大小( 这可能导致缓冲区溢出 )。

并且:

最新版本的C标准(2011年)明确地将此function从其规范中删除。 该函数在C ++中已弃用(截至2011年标准,遵循C99 + TC3)。

当然,现在通常建议将fgets替换为gets ,因为它的声明如下所示:

 char * fgets ( char * str, int num, FILE * stream ); 

它需要一个尺寸参数。 这使它比gets更安全。

既然我不愿意花钱去下载或购买C11 standard ,那么任何人都可以了解弃用gets的原因及其对未来代码的意义吗? 当fgets更安全时,为什么它存在于同一个地方? 为什么它只是刚刚被弃用?

gets被弃用是因为它不安全,正如您已经引用的那样,它可能导致缓冲区溢出。 为了替换,C11提供了一个替代的gets_s ,其签名如下:

 char *gets_s(char *s, rsize_t n); 

请注意,C11仍然建议fgets替换gets

是否将标准置于标准中首先是有争议的,但委员会认为,当程序员对输入有足够的控制权时, gets是有用的。

以下是委员会的官方解释。

国际标准的基本原理 – 编程语言 C§7.19.7.7 getsfunction

因为gets不检查缓冲区溢出,所以当它的输入不在程序员的控制之下时使用它通常是不安全的。 这导致一些人质疑它是否应该出现在标准中。 委员会认为,在程序员对输入有足够控制的情况下,在特殊情况下, gets是有用和方便的,并且作为长期存在的实践,它需要标准规范。 但是,一般来说,首选函数是fgets (参见§7.19.7.2)。

既然我不愿意花钱去下载或购买C11标准,那么任何人都可以了解弃用获取的原因及其对未来代码的意义吗?

来自C99 C委员会理由:

因为gets不检查缓冲区溢出,所以当它的输入不在程序员的控制之下时使用它通常是不安全的。 这导致一些人质疑它是否应该出现在标准中。 委员会认为,在程序员对输入有足够控制的情况下,在特殊情况下,获取是有用和方便的,并且作为长期存在的实践,它需要标准规范。 然而,通常,优选的function是fgets。