思考题2020.1.22
Posted 2002ljy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了思考题2020.1.22相关的知识,希望对你有一定的参考价值。
很多同学博客里都说c语言不安全,不严谨,那么c语言哪里不安全,不严谨?
一、不严谨性:
1.C语言在数组下标越界的时候是不会提示错误的,这导致经常自己犯了数组越界的错误而不自知,只看到最后的运行结果是错误的,最后常常要经过好几次调试才能发现越界的错误(刚学数组的时候我经常干这事o(╥﹏╥)o)
2.对变量赋值的格式对应,要求不严格,在c语言中,我要是把一个浮点型数据赋给一个整型变量,在编译的时候只会给出警告,告诉你会丢失精度,但是是可以运行的,那这样子就导致在运行后发现有错,但是很难发现哪里出现错误,这也就让后期找错修改代码要花费很多不必要的时间。(深受其害o(╥﹏╥)o)
3.C语言的switch语句由case组成,每个case结束以后都要用一个break来跳出case,否则会继续执行下面的case。这样的设定可有好有坏,好处就是可以让多种情况执行相同的操作,不大好的地方就是,如果要在需要跳出case的地方忘了break,那就会出错,并且后期检查不易看到。(不知道这算不算不严谨,个人认为算)
二、不安全性:
之前正好有看到到一些关于C语言缓冲区溢出漏洞的资料,也不知道我理解的对不对,这里就蛮说说。
上面在讲不严谨性时讲到了C语言在数组越界的时候是不会提示错误的,那么多余溢出的部分会去覆盖程序中不属于自己的内存,如果覆盖的是不重要的内存,或者没有用的内存,那还没什么事,程序会正常运行结束,要是正好覆盖的是存放了重要数据的内存,那结果不堪设想。这样黑客可以利用这个漏洞覆盖重要的变量来达到自己的目的。缓冲区溢出通常可分为堆溢出和堆栈溢出,当时看的时候我看的比较明白的是堆溢出,我感觉堆溢出就是找到你想覆盖的重要变量,再找到一个内存地址比你想覆盖的变量的地址低的地方,在这个地方开始溢出,溢到上面把这个目标变量给覆盖掉,不过要保证在覆盖的过程中程序还能正常运行,不被人发现溢出,这样才能悄悄干坏事。堆栈溢出的思想感觉跟堆溢出的思想差不多,不过做法还没看的很明白,我就不说了。
别的漏洞我就不太知道了,嘿嘿嘿~
以上是关于思考题2020.1.22的主要内容,如果未能解决你的问题,请参考以下文章