获取()和Scanf()中止陷阱6错误

时间:2016-07-14 05:29:42

标签: c

我遇到了问题。我想看看获取 scanf()之间的区别。但是,我的终端显示为::

警告:此程序使用gets(),这是不安全的。 中止陷阱:6

是否存在一些规则,其中gets()和scanfs()无法在一个代码中聚集在一起?

#include <stdio.h>

int main(void){
    char passage[10];
    printf("Enter in a passage same one twice:: \n");
    scanf("%s", passage);
    gets(passage);

    printf("Using scanf:: %s", passage);
    printf("Using Gets:: %s", passage);
}

P.S。人们说我目前正在写我不拥有的内存,但我没有在这段代码中遇到问题。感谢!!!

3 个答案:

答案 0 :(得分:2)

gets()容易受到缓冲区溢出的影响,因此非常不鼓励。此漏洞来自于无法指定传递给gets()的缓冲区实际大小的事实。在你的情况下,通道是10个字符长,想象一下,如果用户键入10个或更多字符。然后,缓冲区将开始指向未分配的内存,并导致基于堆栈的缓冲区溢出。

您的编译器正在使用的C库似乎试图阻止您编译易受攻击的代码。如果您仍想使用gets(),请改用fgets()并将文件指针设置为stdin。 fgets()的优点是它允许您指定缓冲区大小。详细了解fgets() here

更新:请注意MikeCAT对此帖子的评论,引用了scanf("%s")在您使用它时的危险。

答案 1 :(得分:1)

它没有一起使用gets和scanf,它正在使用获取所有。获取(http://man7.org/linux/man-pages/man3/gets.3.html)的联机帮助页说它比我更好:

  

永远不要使用gets()。因为在不事先知道数据的情况下无法判断get()将读取多少个字符,并且因为gets()将继续存储超出缓冲区末尾的字符,所以使用它是非常危险的。它已被用来打破计算机安全。请改用fgets()。有关更多信息,请参阅http://cwe.mitre.org/data/definitions/242.html

上的CWE-242(又名“使用固有危险函数”)

答案 2 :(得分:0)

基本区别[参考您的特定情况],

scanf() ends taking input upon encountering a whitespace, newline or EOF
gets() considers a whitespace as a part of the input string and ends the input upon encountering newline or EOF.


However, to avoid buffer overflow errors and to avoid security risks, its safer to use fgets().