我在C中有点生疏,但我遇到了这个奇怪的问题:
我写了这个程序:
#include <stdio.h>
main()
{
int n;
n=1;
while (n>0)
{
puts("Write a number: ");
scanf(" %d",&n);
printf("This is the number you wrote: %d\n", n);
}
}
显然绝对没有语法错误,而且我能理解的是,也没有任何编译错误。它完美地编译和构建。 现在,如果我切换这一行:
puts("Write a number: ");
这一个:
printf("Write a number: ");
它编译时没有错误,但是当编译对象启动时,它立即停止并弹出反病毒警告,说它识别出特洛伊木马。在得出任何结论之前,我已经多次构建它,在收到相同的消息后,我在virustotal.com上扫描了它,结果是this。
嗯,我知道puts实际上比printf更正确,但它仍然可以正常工作......
这里有什么问题?
我正在使用AVG反病毒和Pelles C进行编译。
提前致谢。
答案 0 :(得分:5)
puts()
无关。
答案 1 :(得分:3)
反病毒软件在signatures上工作,这些软件基本上是病毒软件使用的可执行代码中的已知模式。
野外的某些病毒与您编写的printf
版本的代码具有相似的模式(我搜索了所有将您标记为病毒的人,不幸的是,他们都没有发布他们的签名文件检查的内容对于)。由于您不应该使用一个参数调用printf
,因此许多反病毒软件提供商可能会将其用作签名过程的一部分。
您拥有的两个选项是不使用单个参数调用printf
(您不应该这样做)或将您的程序作为误报提交给防病毒供应商,他们说您的程序是病毒,他们可能会更新他们的签名,以排除您的程序为误报。
答案 2 :(得分:0)
printf()有一个Uncontrolled format string security risk
你应该使用puts()
也发现了这个:
请参阅What is the difference between printf() and puts() in C?
中的评论关于使用printf而不是puts的说明:never,永远不要用printf(变量)来打印字符串。使用puts(变量)或printf(“%s”,变量)。使用变量格式字符串存在安全风险:如果变量可以由攻击者编写,则可以使用格式字符串攻击程序。 - Zan Lynx Dec 1'12 at 9:05