使用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
gets
function :因为
gets
不检查缓冲区溢出,所以当它的输入不在程序员的控制之下时使用它通常是不安全的。 这导致一些人质疑它是否应该出现在标准中。 委员会认为,在程序员对输入有足够控制的情况下,在特殊情况下,gets
是有用和方便的,并且作为长期存在的实践,它需要标准规范。 但是,一般来说,首选函数是fgets
(参见§7.19.7.2)。
既然我不愿意花钱去下载或购买C11标准,那么任何人都可以了解弃用获取的原因及其对未来代码的意义吗?
来自C99 C委员会理由:
因为gets不检查缓冲区溢出,所以当它的输入不在程序员的控制之下时使用它通常是不安全的。 这导致一些人质疑它是否应该出现在标准中。 委员会认为,在程序员对输入有足够控制的情况下,在特殊情况下,获取是有用和方便的,并且作为长期存在的实践,它需要标准规范。 然而,通常,优选的function是fgets。