欢迎来到天天文库
浏览记录
ID:56980168
大小:35.00 KB
页数:7页
时间:2020-07-30
《有趣的C语言面试题带答案.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1.gets()函数问:请找出下面代码里的问题:1.#include 2.int main(void) 3.{ 4. char buff[10]; 5. memset(buff,0,sizeof(buff)); 6. 7. gets(buff); 8. 9. printf(" The buffer entered is [%s]",buff); 10. 11. return 0; 12.} 答:上面代码里的问题在于函数gets()的使用,这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出。这里推荐使
2、用标准函数fgets()代替。2.strcpy()函数问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗?1.#include 2. 3.int main(int argc, char *argv[]) 4.{ 5. int flag = 0; 6. char passwd[10]; 7. 8. memset(passwd,0,sizeof(passwd)); 9. 10. strcpy(passwd, argv[1]); 11. 12. if(0 == strcmp("LinuxGeek", passwd)) 13.
3、 { 14. flag = 1; 15. } 16. 17. if(flag) 18. { 19. printf(" Password cracked "); 20. } 21. else 22. { 23. printf(" Incorrect passwd "); 24. 25. } 26. return 0; 1.} 答:破解上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。所
4、以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。例如:1.$ ./psswd aaaaaaaaaaaaa 2. 3.Password cracked 虽然上面的密码并不正确,但我们仍然可以通过缓存溢出绕开密码安全保护。要避免这样的问题,建议使用strncpy()函数。作者注:最近的编译器会在内部检测栈溢出的可能,所以这样往栈里存储变量很难出现栈溢出。在我的gcc里默认就是这样,所以我不得不使用编译命令‘-fno-stack-protector’来实现上述方案。
5、3.main()的返回类型问:下面的代码能编译通过吗?如果能,它有什么潜在的问题吗?1.#include 2. 3.void main(void) 4.{ 5. char *ptr = (char*)malloc(10); 6. 7. if(NULL == ptr) 8. { 9. printf(" Malloc failed "); 10. return; 11. } 12. else 13. { 14. // Do some processing 15. free(p
6、tr); 16. } 17. 18. return; 19.} 答:因为main()方法的返回类型,这段代码的错误在大多数编译器里会被当作警告。main()的返回类型应该是“int”而不是“void”。因为“int”返回类型会让程序返回状态值。这点非常重要,特别当程序是作为依赖于程序成功运行的脚本的一部分运行时。4.内存泄露问:下面的代码会导致内存泄漏吗?1.#include 2. 3.void main(void) 4.{ 5. char *ptr = (char*)malloc(10); 1. 2. if(NULL == ptr) 3.
7、 { 4. printf(" Malloc failed "); 5. return; 6. } 7. else 8. { 9. // Do some processing 10. } 11. 12. return; 13.} 答:尽管上面的代码并没有释放分配给“ptr”的内存,但并不会在程序退出后导致内存泄漏。在程序结束后,所有这个程序分配的内存都会自
此文档下载收益归作者所有