自动化代码分析的过去、现状和将来

发表于:2008-2-01 17:54

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:译者:陈能技    来源:51Testing投稿

分享:

新时代、新的威胁:为安全和知识产权的违背而分析代码
        在可预见的将来,安全将会成为自动化代码分析的主要目标。在网络渗透到企业计算的基础结构之前,应用软件的安全主要通过物理设施的保护、限制网络的范围。这种方式在当今社会很难实施,因为通过快速的网络让所有信息更容易获取这个概念太吸引人了。因此,大部分企业数据理论上都能通过私有或公共的网络访问到,黑客们变得擅长于闯入网络安全区域,通过输入意外的数据使程序失常。
        SQL注入和缓冲区溢出是两种很好的例子。SQL注入让黑客可以插入数据库服务器可能错误执行的命令。缓冲区溢出的方式则是通过输入过长的数据企图让程序以黑客可控制的方式异常地中断。不好的编码习惯往往是导致这些安全问题的原因。
        有些多用途的代码分析器能帮助你找到造成明显安全风险的代码。开源的代码分析器PMD能分析以下包含风险的代码:
• MethodReturnsInternalArray(返回内部数组的方法):暴露内部的数组,让用户可以直接修改一些关键的代码。返回数组的拷贝会安全些。
• ArrayIsStoredDirectly(直接存储数组):构造函数或方法接收的数组应该克隆对象并存储拷贝。这样可防止将来的用户修改,影响内部功能。
        这是两个很好的编码规则,但是它们未能深入到代码的安全隐患的中心位置。为了更加深入,你需要专门的安全分析器。幸运的是,在这几年,出现了像Fortify、Secure这样的软件公司,他们把专门设计用于检测不安全代码的分析工具带到了市场上,很容易预知的是:这类工具将持续占领自动化代码分析工具的市场。
        为了确保你的数据不被偷窃或被危机,你需要分析代码的安全漏洞。但是你还需要考虑另外一方面的问题 – 确保你的代码不会侵权或违反知识产权。
        在这个开源和在线代码共享的时代,很容易使用或拷贝那些你无权使用或受限制使用的代码。大部分开源的项目,即便是Free Software Foundation的代码,也是受版权保护的。为了使用这些代码,你必须遵循它的许可证。如果你在产品中不注意地使用了这些代码,可能会被迫“开源”你的产品或者付很高的罚款给版权所有者。
        幸运的是,有另外一类的自动化代码分析工具,这些工具已经出现在市场上。ProtexIP Suite是Black Duck软件公司的产品,使用了一种被称为“代码印迹”(Code Print)的技术和在线知识库来自动化地识别引入到软件项目代码中的开源和第三方软件代码。
动态代码分析:让你的CPU像你一样勤快地工作
        在过去几十年我们亲眼目睹了处理器处理能力的巨幅提高,这让很多静态分析的实时执行,并且给开发人员即时的反馈成为可能。但是现在的处理能力实际上已经远远超越了自动化静态代码分析所需要的能力,因此我们可以发现一个崭新的通过在执行过程中分析代码和整个系统来发现潜在问题的自动化代码分析类别。
        动态代码分析的概念并不新颖;像性能分析器、内存泄漏检查器等,都是出现了很久的技术,这些都是需要在代码执行时才能工作的工具。但是新的动态代码分析工具让人感到兴奋,它们能充分利用大幅提高的计算能力。现在有大量过剩的CPU计算周期,而且很多开发人员的CPU在大部分时间是空闲的。这对于程序员来说是一个新的情形。几年前,对于开发人员来说等待若干分钟的时间在等待编译器完成编译工作是很平常的事情。这也是为什么很多程序员会玩边抛边接的杂耍游戏的原因 – 不能上网,玩杂耍是在等待编译完成期间消磨时间的好办法。
        现在情况不一样了。当我在开发代码的时候,处理器大部分时间是空闲的,直到我触发一个Build – 然后我的电脑就精力充沛地开始嗡嗡作响。在我想稍作休息时,编译已经完成,处理器回到空闲状态,我又要回到工作。怪不得我的杂耍技巧没有以前那么好了。
        考虑到开发人员的时间比CPU时间有价值得多,因此如何让CPU多做工作,从而帮助程序员更加有效地使用自己的时间,看起来就变得很有意义了。
让你的CPU保持忙碌的行为
        动态代码分析和软件测试是其中一个需要关注和帮助的区域,也是利用CPU能力的最佳区域。XP和其他敏捷软件开发者重新发现了开发人员自己测试代码重要性,他们认为开发人员应该在整合之前不断地编写和执行单元测试。有赖于这些敏捷方法的流行,很多开发人员和开发经理都认可这种做法:在每个Build版本之前由开发人员编写和执行单元测试是提高软件质量整体水平和降低缺陷代价的最好办法。
        不幸的是,开发一整套的测试代码可能比编写真正的代码要更加复杂和耗时。通常100行的代码需要300到400行的测试代码来达到90%到100%的测试覆盖率。测试是各类检查和验证的组合,这让基于动态分析的自动化成为测试的最佳候选,最近这个领域出现了很大的发展,既有学术性上的,也有商业上的。
性能分析和内存使用方面的动态代码分析
        性能分析是一个已被很好建立的动态代码分析的示范。开发人员使用性能分析工具来分析代码,然后用一些测试或例子来驱动代码,然后检查性能结果来识别和定位瓶颈。这种类型的代码分析能促进代码性能的提高,但是手工地进行是很困难的、很繁复和耗时的。编译器基于静态分析能优化代码,而一些编译器现在可以自动地基于动态代码分析来优化性能,给开发者节省了大量的工作。例如,Intel系列的编译器使用一个叫做分析指南优化(profile-guided optimization)的技术,在程序的预执行过程中收集数据,利用这些数据分析来提高性能,相比静态分析能达到额外的、更广泛的优化空间。
        将来,动态分析能更进一步,考虑并测试更多影响性能的因素。可以想象一个动态的性能分析工具,用一些有代表性的输入数据或测试,分析和识别出影响性能的参数(例如,一个文件读操作的缓冲区大小)。然后它会调整那些参数,运行一系列的性能测试来检查是否对于某个系统配置,不同的设置会改善性能表现。不知道你是否会喜欢这样的性能分析工具,它能告诉你这些:
        “基于有代表性的输入和系统配置,经过了342次测试,发现对于变量bufSize来说,最优的值是1024字节(目前是4096字节)。点击这里进行修改。”
充分利用网格计算 – 下一代自动化代码分析技术
        上面的动态代码分析的例子不像它听起来那么牵强,尤其是当自动化代码分析工具利用了网格计算时。通过网格计算,成千上万的不同类型的计算节点的处理能力、存储和带宽都能整合在一起,让用户和应用程序能无缝地访问大量IT能力和大量系统配置。科研组织和政府实验室已经使用网格计算很多年了,现在像IBM、SUN这些公司也在设法让这些技术商业化,提供按需索取的计算能力。如果你想在几个小时的时间内完成两百万行代码的深度分析,SUN的Sun Grid可以给你1美元一小时CPU时间的计算能力。
        我知道我在扩展自动化代码分析的定义。也许我应该使用一个更加广泛的术语“自动化软件分析”,因为现在的产品代码实际上是一些组件的集合 – 配置文件、安装文件等 – 组装在一起为软件服务。不管命名是怎样,我相信这类型的工具必须持续进化,以便满足开发者的需要,并利用现有的技术。
        在代码分析工具的早期,整个软件用一个语言编写,在一个操作系统平台上运行,通常在特定的硬件配置上运行。而现在的软件通常使用几种编程语言,并且需要支持多平台操作系统和各种各样的硬件配置。我有个在大软件企业工作的朋友把这称为“死亡矩阵”(The Matrix of Death)。唯一有效解决死亡矩阵的方法,并且也是迎接像安全、IP侵犯的挑战的方法,是开发和利用新的技术、新的自动化分析工具。
总结
        软件比以前更加复杂了,要想确保大范围的系统配置下软件的集成性、功能正确性、性能,还有大量代码的合法性,是让人畏惧的挑战。幸运的是,处理器的性能提高,已经不是Lint时代的表现了,让大量的自动化代码分析技术得以出现,大量非常实用的工具得以出现和进化,并且产生了新的分析类别。我相信网格计算会促使自动化代码分析的进一步发展。在那之前,我建议你开始寻找大量已经出现的开源和商业的产品。如果你把自动化代码分析等同于Lint,你会发现很多惊喜的内容。记住,你应该让CPU像你一样勤快地工作。

版权声明:51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像。51testing软件测试网欢迎与业内同行进行有益的合作和交流,如果有任何有关内容方面的合作事宜,请联系我们

22/2<12
价值398元的测试课程免费赠送,填问卷领取吧!

精彩评论

  • xiechungang
    2008-2-19 15:52:03

    不错 fortify就是个不错的静态代码分析工具

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2022
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号