使用gets防止缓冲区溢出

时间:2013-12-24 01:08:13

标签: c language-lawyer fgets buffer-overflow gets

gets的声明是:

char * gets ( char * str );

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

cplusplus.com 2

  

请注意,获取与fgets完全不同:不仅获得使用   stdin作为源,但它不包括结束换行符   在结果字符串中,不允许指定最大大小   for str(可导致缓冲区溢出)。

还有:

  

最新版本的C标准(2011年)已明确提出   从其规范中删除了此功能。功能是   在C ++中弃用(截至2011年标准,遵循C99 + TC3)。

现在,当然,fgets通常被推荐为gets的替代品,因为它的声明如下:

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

DOES 采用尺寸参数。这使它比gets更安全。

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

2 个答案:

答案 0 :(得分:7)

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

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

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

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

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

  

Rationale for International Standard - Programming Languages C§7.19.7.7 gets函数

     

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

答案 1 :(得分:2)

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

C99委员会理由:

  

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