静态代码检查讨论 话说,连我自己都不能保证靠肉眼看出代码里到底哪里有BUG你这东西做出来,那是要比我智商还高才行啊你觉得以我的智商,能做出比我智商还高的人工智能吗 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 先要重新搞明白以下问题:“发现一些未定义的变量”,编译器就会给你警告了。你是要另外发明一个(编译器)语法分析系统吗?“数据类型不匹配”,你的程序还能编译通过吗?你是要另外发明一个编译器系统吗?“返回局部变量”,有什么不可以?你是从哪本过时的书上抄来的这个概念呢?“数组字符串边界溢出”,你显然是搬弄错了书了。这是.net framework在运行时做的事情,你是要另外开发一个.net CLR 吗?“内存泄露”,你知道这能算是静态代码检查吗? java程序,使用CheckStyle,PMD等,比较流行,还能和日构建系统进行集成VS2010上,我觉得StyleCop不错,一直使用这个做简单的检查 如果涉及到网络通信,获取的是二进制流,要反序列化,工具能提前知道要接收什么数据才怪如果涉及到调用dll,难道你的工具还要先反编译dll然后再检查代码吗 我目前就是干这个的,首先是词法分析, 语法分析,语义分析,生成抽象语法树,然后写规则即可,C#这块微软有很好的开源编译器Roslyn,已经非常强大,抽象语法树信息很全,关联信息也很好找,其中难点是数据流跟踪,我只能给你提供思路 那我给你一段代码,你能判断索引超出界限不string[] s=new string[3];int i=0;while(true){if(i<3){i++;string s1=s[i];}} 再来int[] int1=new int1{1,3,4,5};string[] s=new string[3];for(int i=0;i<3;i++){string s1=s[int1[i]];} 我就把从txt文件里读出来的一个数字转int型然后当索引用,程序如何在编译的时候就知道会索引超出界限? 我觉得以后加,也不可能完全检查出所有的bug的.写死在代码里的,从本地文件读出来,甚至从本地数据库读出来,可能都有办法检查,至少理论上能检查从网络中获取的怎么办而且有些变量本身就是动态的,不是写死的,你静态检查的时候它是对的,它运行时被重新赋值了怎么办比如某个数字是通过文本框输入的 我觉得以后加,也不可能完全检查出所有的bug的.写死在代码里的,从本地文件读出来,甚至从本地数据库读出来,可能都有办法检查,至少理论上能检查从网络中获取的怎么办而且有些变量本身就是动态的,不是写死的,你静态检查的时候它是对的,它运行时被重新赋值了怎么办比如某个数字是通过文本框输入的的确不能,所以目前项目中都没有这个计划,下一步是想弄无源码的检测 发现一些未定义的变量---编译器自己检查,不需要人眼扫描数据类型不匹配---编译器自己检查,不需要人眼扫描返回局部变量---这个没啥问题,如果你是指跨作用域使用,编译器有警告,不需要人眼扫描数组字符串边界溢出---运行期的事情,静态检查无效内存泄露----运行期的事情,静态检查无效-------------------后两个去找单元测试人员,这活是单元测试人员的工作ps:当然优化和规定也不是没有,多数重构工具本身就有一部分重构优化建议(vs自己本身也带有规范检查工具,不过我不建议使用,因为那个浪费工作效率,程序员更多的聪明才智应该在其他方面,而不是天天弄一些无味的工作) 递归方法遍历xml题 子控件重绘的问题,求教高手 高手请进,解决问题!! 我理想当中得程序语言 急求GridView分页代码..先谢啦! 在C#底下如何截获其它窗口的WM_PAINT 消息啊? 邪门了 SQL数据库 后台能够编辑 查看 删除 就是不能添加数据 如何使某个指定的窗口是活动的? 跪求用mshtml的例子,msdn都是E文,看不懂1 水晶报表问题,编译器错误信息: CS1026: 应输入 ) 使用NPOI导出Excel ICell调用过多 内存溢出 关于接口、类的概念,请教大家!
VS2010上,我觉得StyleCop不错,一直使用这个做简单的检查
如果涉及到调用dll,难道你的工具还要先反编译dll然后再检查代码吗
string[] s=new string[3];
int i=0;
while(true)
{
if(i<3)
{
i++;
string s1=s[i];
}
}
int[] int1=new int1{1,3,4,5};
string[] s=new string[3];
for(int i=0;i<3;i++)
{
string s1=s[int1[i]];
}
写死在代码里的,从本地文件读出来,甚至从本地数据库读出来,可能都有办法检查,至少理论上能检查
从网络中获取的怎么办
而且有些变量本身就是动态的,不是写死的,你静态检查的时候它是对的,它运行时被重新赋值了怎么办
比如某个数字是通过文本框输入的
写死在代码里的,从本地文件读出来,甚至从本地数据库读出来,可能都有办法检查,至少理论上能检查
从网络中获取的怎么办
而且有些变量本身就是动态的,不是写死的,你静态检查的时候它是对的,它运行时被重新赋值了怎么办
比如某个数字是通过文本框输入的的确不能,所以目前项目中都没有这个计划,下一步是想弄无源码的检测
数据类型不匹配---编译器自己检查,不需要人眼扫描
返回局部变量---这个没啥问题,如果你是指跨作用域使用,编译器有警告,不需要人眼扫描
数组字符串边界溢出---运行期的事情,静态检查无效
内存泄露----运行期的事情,静态检查无效
-------------------
后两个去找单元测试人员,这活是单元测试人员的工作ps:当然优化和规定也不是没有,多数重构工具本身就有一部分重构优化建议(vs自己本身也带有规范检查工具,不过我不建议使用,因为那个浪费工作效率,程序员更多的聪明才智应该在其他方面,而不是天天弄一些无味的工作)