使用gets防止缓冲区溢出

use*_*113 4 c gets fgets buffer-overflow language-lawyer

声明gets是:

char * gets ( char * str );
Run Code Online (Sandbox Code Playgroud)

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

cplusplus.com2:

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

并且:

最新版本的C标准(2011年)最终将该功能从其规范中删除.该函数在C++中已弃用(截至2011年标准,遵循C99 + TC3).

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

char * fgets ( char * str, int num, FILE * stream );
Run Code Online (Sandbox Code Playgroud)

DOES需要的尺寸参数.这使它比它更安全gets.

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

Yu *_*Hao 7

gets不推荐使用,因为它不安全,正如您已经引用的那样,它可能会导致缓冲区溢出.对于替换,C11提供了gets_s具有如下签名的替代方案:

char *gets_s(char *s, rsize_t n);
Run Code Online (Sandbox Code Playgroud)

请注意,C11仍建议fgets更换gets.

首先是否提出gets标准是有争议的,但委员会认为,gets当程序员对输入有足够的控制权时,这是有用的.

这是委员会的官方解释.

理国际标准-编程语言ç §7.19.7.7 gets功能:

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