问题描述
有高手,对这个了解的么?原理是咋样的,大家可以交流一哈,准备开发一个工具还实现提高代码质量。所谓静态代码检查,即是对程序代码的检查,发现一些未定义的变量、数据类型不匹配、返回局部变量、数组字符串边界溢出、内存泄露等等。。
解决方案
解决方案二:
等你研究出来了,可以卖给微软
解决方案三:
引用1楼Z65443344的回复:
等你研究出来了,可以卖给微软
大神有没有好的指教啊?谈谈你有没有这方面的经验分享的?
解决方案四:
你代码跑起来都不见得每次都会内存泄露,边界溢出,要不一定等到进入哪个分支,或者多线程执行冲突的时候才会出现这样的问题你要在代码执行之前就检测出来,不亚于人工智能
解决方案五:
话说,连我自己都不能保证靠肉眼看出代码里到底哪里有BUG你这东西做出来,那是要比我智商还高才行啊你觉得以我的智商,能做出比我智商还高的人工智能吗
解决方案六:
先要重新搞明白以下问题:“发现一些未定义的变量”,编译器就会给你警告了。你是要另外发明一个(编译器)语法分析系统吗?“数据类型不匹配”,你的程序还能编译通过吗?你是要另外发明一个编译器系统吗?“返回局部变量”,有什么不可以?你是从哪本过时的书上抄来的这个概念呢?“数组字符串边界溢出”,你显然是搬弄错了书了。这是.netframework在运行时做的事情,你是要另外开发一个.netCLR吗?“内存泄露”,你知道这能算是静态代码检查吗?
解决方案七:
引用楼主fds3310的回复:
原理是咋样的,大家可以交流一哈,准备开发一个工具还实现提高代码质量。
把你上学时的编译系统课程的成绩贴出来我们看看。这基本上是大学毕业生做毕业实习时,几个学生想做的课题。你既然不知道这个题目的渊源,怎么会想到它的呢?如果很有闲时间搞这个,那么也需要你先写一个c#编译器再说。2年以后看你的结果。基本上这种小东西,做出来也没有人买的。因为编译器(例如c#编译器)早就有这些功能。
解决方案八:
题目看起来很高大上,但是实际上根本没法实现的代码运行起来到底会不会有问题,那只有真正运行起来才知道,编译器再智能也不行理论和实际是有差别的理论上,就不应该出现内存泄露的问题,因为理论上内存是无限大的但是实际上内存是有限的,你难道还要求编译器在程序运行之前就计算系统资源,知道你的程序到底要占用多少内存吗
解决方案九:
如果你做的程序仅仅是在玩值类型计算赋值,值类型元素的数组,可能还能通过人工判断看出一些问题而如果你的程序涉及多线程互斥,访问IO(读写文件,网络通信,串口通信,数据库通信),鬼知道到时候数据会有多大
解决方案十:
你这些,要不就是编译器已经实现的,要么就是无法实现的。
解决方案十一:
java程序,使用CheckStyle,PMD等,比较流行,还能和日构建系统进行集成VS2010上,我觉得StyleCop不错,一直使用这个做简单的检查
解决方案十二:
有些工作VS或者一些代码校验的插件就会帮你检查了。。。。。有些是运行时的东西,没法静态检查。
解决方案十三:
如果涉及到网络通信,获取的是二进制流,要反序列化,工具能提前知道要接收什么数据才怪如果涉及到调用dll,难道你的工具还要先反编译dll然后再检查代码吗
解决方案十四:
哈哈,看来我弄错了,我理解的静态代码检查,一直以为是编写代码时默认遵守的规则,比如:代码相似度高---有抄袭可能代码行过长圈复杂度高不规范的空格、空行问题违反变量命名规约等等
解决方案十五:
我目前就是干这个的,首先是词法分析,语法分析,语义分析,生成抽象语法树,然后写规则即可,C#这块微软有很好的开源编译器Roslyn,已经非常强大,抽象语法树信息很全,关联信息也很好找,其中难点是数据流跟踪,我只能给你提供思路
其他方案:
引用14楼bigbaldy的回复:
我目前就是干这个的,首先是词法分析,语法分析,语义分析,生成抽象语法树,然后写规则即可,C#这块微软有很好的开源编译器Roslyn,已经非常强大,抽象语法树信息很全,关联信息也很好找,其中难点是数据流跟踪,我只能给你提供思路
那我给你一段代码,你能判断索引超出界限不string[]s=newstring[3];inti=0;while(true){if(i<3){i++;strings1=s[i];}}
其他方案:
再来int[]int1=newint1{1,3,4,5};string[]s=newstring[3];for(inti=0;i<3;i++){strings1=s[int1[i]];}
其他方案:
我就把从txt文件里读出来的一个数字转int型然后当索引用,程序如何在编译的时候就知道会索引超出界限?
其他方案:
目前不能,其实这个就属于数据流跟踪,数据流跟踪中的循环会拆解为执行一次,而不是完全的模拟执行,毕竟是“静态“代码检测,当然以后可以加这个功能
其他方案:
引用18楼bigbaldy的回复:
目前不能,其实这个就属于数据流跟踪,数据流跟踪中的循环会拆解为执行一次,而不是完全的模拟执行,毕竟是“静态“代码检测,当然以后可以加这个功能
我觉得以后加,也不可能完全检查出所有的bug的.写死在代码里的,从本地文件读出来,甚至从本地数据库读出来,可能都有办法检查,至少理论上能检查从网络中获取的怎么办而且有些变量本身就是动态的,不是写死的,你静态检查的时候它是对的,它运行时被重新赋值了怎么办比如某个数字是通过文本框输入的
其他方案:
补充一句:楼主问的就是静态代码检测中的边界溢出,我回答的也是我能检测静态代码检测中的边界溢出问题
其他方案:
引用19楼Z65443344的回复:
Quote: 引用18楼bigbaldy的回复:
目前不能,其实这个就属于数据流跟踪,数据流跟踪中的循环会拆解为执行一次,而不是完全的模拟执行,毕竟是“静态“代码检测,当然以后可以加这个功能我觉得以后加,也不可能完全检查出所有的bug的.写死在代码里的,从本地文件读出来,甚至从本地数据库读出来,可能都有办法检查,至少理论上能检查从网络中获取的怎么办而且有些变量本身就是动态的,不是写死的,你静态检查的时候它是对的,它运行时被重新赋值了怎么办比如某个数字是通过文本框输入的
的确不能,所以目前项目中都没有这个计划,下一步是想弄无源码的检测
其他方案:
引用20楼bigbaldy的回复:
补充一句:楼主问的就是静态代码检测中的边界溢出,我回答的也是我能检测静态代码检测中的边界溢出问题
既然楼主已经提到了内存泄露,这已经不是静态范畴了吧我觉得楼主这个静态修饰的不是代码,而是检测是静态的代码检测,而不是检测静态代码
其他方案:
发现一些未定义的变量---编译器自己检查,不需要人眼扫描数据类型不匹配---编译器自己检查,不需要人眼扫描返回局部变量---这个没啥问题,如果你是指跨作用域使用,编译器有警告,不需要人眼扫描数组字符串边界溢出---运行期的事情,静态检查无效内存泄露----运行期的事情,静态检查无效-------------------后两个去找单元测试人员,这活是单元测试人员的工作ps:当然优化和规定也不是没有,多数重构工具本身就有一部分重构优化建议(vs自己本身也带有规范检查工具,不过我不建议使用,因为那个浪费工作效率,程序员更多的聪明才智应该在其他方面,而不是天天弄一些无味的工作)