最近,我听到许多人在讨论Java开发是否比C / C ++开发更具风险(从现在开始,我仅指“ C”)。 他们没有重新讨论关于哪种语言最好的古老的讨论,但是他们想知道用Java开发的团队与使用C语言开发的团队相比是否有独特的风险。他们特别感兴趣,以了解项目如何更好地理解和管理风险。
出于本文的目的,我将忽略跨语言的风险来源,例如社会工程和配置/培训问题,这些风险可能是恒定不变的。 接下来的内容是基于我自己的经验(包括偏见和全部),但前提是这不是数字讨论。
令我感到羞耻的是,我最初认为答案很明显:Java旨在解决C的许多最重要的缺陷,因此它必须更安全。 数十年来,黑客一直在利用C漏洞,例如超出范围的内存访问和空指针取消引用,规避控制并中断关键业务功能(在某些情况下是关键任务和生命关键功能)。 (激进主义黑客巴纳比·杰克 ( Barnaby Jack )计划在他不久前过世之前披露植入式医疗设备中的致命,可利用的漏洞)
Java完全消除了许多此类漏洞,提供了内部保护,这些保护可自动实施缓冲区范围并拦截并将空和无效的内存引用传递给应用程序,以进行顺畅的处理。 C程序需要导航迷宫般的POSIX和Windows之类的API才能获得线程和并发管理功能,而Java提供了语言原语,使开发人员能够一致地管理并发。
尽管C内存管理非常棘手,但Java提供了垃圾回收器,使资源管理几乎万无一失。 虽然将C应用程序编译为具有直接的硬件和OS访问权限,但是Java程序在虚拟机沙箱中运行,试图阻止它们与系统的其余部分进行交互。 当然,这意味着Java的风险较小。
当然,我们会定期听到有关数据泄露和网站攻击的信息,这些都是Java十分常用的区域。 实际上,绝大多数安全漏洞(例如注入,跨站点脚本和身份验证/会话管理)源自错误的代码,这意味着Java应用程序无法幸免于这些安全问题。 应用程序代码中还存在许多其他类型的风险,这些风险会影响可用性,数据完整性和性能。 归根结底,这个问题比我最初意识到的要复杂。
退后一步,我意识到我最初的反应集中在运行时环境中固有的风险上。 Java改善了C的弱点,特别是在阻止应用程序用户获得对运行应用程序的计算机的控制方面。 但是,获得计算机的控制权几乎不是目标-它通常只是一种访问或中断数据流的方式。 考虑到显然仍然存在的应用程序漏洞的相关性,这些改进显然只是朝着正确方向迈出的一步。
要理解其含义,也许我应该考虑更大的前景。 按照定义,像Java和C这样的通用编程语言旨在应用于各种编程任务。 他们提供了使开发人员能够实现其应用程序的工具箱。 开发人员有责任为应用程序设计一个良好的逻辑模型,并使用可用的工具正确地实现该模型。 从这种角度来看,“风险”语言可能是开发人员有效管理该风险的能力有限的一种。
C和Java都有强大的工具来管理应用程序风险-从功能丰富的IDE到复杂的分析和调试工具,再到测试框架和高质量可重用组件。 我不认为这两种语言在管理风险方面都处于不利地位,因此也许该语言并不是风险的来源。 也许实际上是应用程序或开发人员。
我想我们已经回答了最初的问题:没有一种语言比另一种语言危险。 但是我认为我们还没有完成。 仍然存在一个有趣的风险管理问题。 我认为进一步描述风险来源并不特别重要。 可以说,它的大部分源于源代码,而应用程序的性质通常定义了主要的风险类型。
那么,这将使我们成为开发人员又将如何呢?
首先,深刻理解您的工具箱。 您选择的语言/环境的优缺点是什么? 它们是否使您免受系统级关注? 是否存在性能折衷? 对于您进行的每个项目,了解您在应用程序中面临的风险。 您是否需要担心并发性,数据安全性和/或资源限制?
Java有一个垃圾收集器,可以在程序使用完某些资源后的某个时间释放它们,但这并不意味着您应该很懒。 并非所有资源都会自动处理,并且可能需要大量时间才能使资源可供重用,从而影响了应用程序的可用性和性能。 通过为最坏的情况做准备,可以最大程度地降低发生这种情况的可能性。 积极地管理尽可能多的资源,以减轻垃圾收集器的负载并减少可用性和性能问题的机会。
即使您拥有大量的语言原语, 并发也很棘手。 如果您想使其正确使用,则需要深入了解应用程序的行为,并且需要了解所使用的并发工具的复杂性。 即使是复杂的分析和调试工具也有其局限性-仅因为代码有效并不意味着它正确地实现了您的要求。
一旦了解了风险,就可以查看是否可以找到在类似应用程序中已得到证明的现有组件和框架-发明比我们预期的更好的轮子通常要困难得多。 在了解了应用程序的风险以及工具的优点和缺点之后,您可以开始将工具的优点与应用程序需求进行匹配,并找到最佳的前进方式。
归根结底,哪种语言最好(或风险最高)的问题只是一种干扰。 为了理解和管理风险,您需要确保开发人员了解其工具的复杂性,制定可靠的计划来应对应用程序所带来的挑战,并具有足够的内部控制来识别何时偏离正常轨道。
以上文章由Coverity的Jon Jarboe提供。 我发表了这篇贡献文章,因为我认为它引起了一些有趣的讨论。 没有收到发布本文的任何报酬或报酬。
翻译自: https://www.javacodegeeks.com/2013/08/is-java-riskier-than-cc.html