如何降低 “ Billion Dollar Mistake ” NPE 风险

举报
斑馬斑馬 发表于 2021/09/10 10:40:53 2021/09/10
【摘要】 1. 准备工作1.1 示例工程  Code4Benchmark是采用Java开发的示例工程,希望用于评估代码质量评估工具或者云服务对代码问题的检查能力,例如空指针(Null Pointer)、资源泄露、SQL注入(SQL Injection)等。  对于空指针场景,目前主要是显式解引用、前置判空、后置判空、空返回值等,代码片段如下:  显式解引用: 直接对null对象解引用void alwa...

1. 准备工作

1.1 示例工程

  Code4Benchmark是采用Java开发的示例工程,希望用于评估代码质量评估工具或者云服务对代码问题的检查能力,例如空指针(Null Pointer)、资源泄露、SQL注入(SQL Injection)等。

  对于空指针场景,目前主要是显式解引用、前置判空、后置判空、空返回值等,代码片段如下:

  显式解引用: 直接对null对象解引用

void alwaysCauseNPE(){ 
    String s = null; 
    System.out.println(s.length()); 
}

  前置判空 :对象前面有判空,后面解引用

void forwardMayCauseNPE(String s){
    if (s != null){ 
        dummy();
    } 
    System.out.println(s.length()); 
}

  后置判空 :对象后面有判空,前面解引用

void reverseMayCauseNPE(String s){ 
    System.out.println(s.length()); 
    if (s != null){
        dummy(); 
    }
}

  空返回值 :空返回值直接解引用

void mayCauseNPE(){
    Pointers.A a = Pointers.mayReturnNull(-10);
    a.method();
}
public static A mayReturnNull(int i){
    if (i > 0){
        return new A();
    }
    return null;
}

1.2 创建项目及代码库

  开发者可以访问华为云DevCloud,登录后在首页新建项目,选择“空白项目”的Scrum或者看板之一,输入项目名称(例如:CodeCheckBenchmark)即可创建项目。

  在访问CodeCheckBenchmark项目,并进入“代码”-“代码托管”后,可以点击“新建”-“导入外部仓库”来创建仓库,输入github上的仓库地址(https://github.com/supremeGoodness/Code4Benchmark.git)。后续步骤接受默认值即可创建仓库。

2. 检查代码

  通常情况下,使用华为云DevCloud进行代码检查非常简单:新建代码检查任务然后执行此任务即可。当前前提是默认的规则集“通用检查规则集”满足代码质量的要求。用户可以在任务的“设置”-“规则集”中选择系统内置的其它规则集(例如“全面检查规则集”)或者自定义的规则集。接下来,我们通过自定义规则集的方式来进行NPE问题的检查。

2.1 自定义规则集

  在访问CodeCheckBenchmark项目,并进入“代码”-“代码检查”后,在“规则集”页面“新增规则集”,输入规则集名称rs-npe-java、检查语言等,如图2所示。然后在规则集的配置页面,将“Correctness - Nullcheck of value previously dereferenced”、“Null dereference”、“Correctness - Possible null pointer dereference”等规则从“未启用”规则中选中保存以变为“已启用”规则

2.2 创建检查任务并设置规则集

  在访问CodeCheckBenchmark项目,并进入“代码”-“代码检查”后,在“任务”页面“新建任务”,选择代码仓库Code4Benchmark、输入任务名称cc-Code4Benchmark等完成任务创建。如图4所示为创建后的任务概览。

2.3 执行检查任务

  在cc-Code4Benchmark任务中,可以点击“开始检查”。在检查完成后,在“概览”页面查看检查结果,如图6所示。在概览中,我们可以发现检测出4个问题。

3. 分析与修改

  在cc-Code4Benchmark任务中,在“概览“页点击未解决问题的数量,或者点击“代码问题”,可以查看问题详情。对于每一个问题,可以根据“修改建议”进行相关的问题修订。

  NPE是Java开发中的经典问题,华为云DevCloud代码检查服务提供的规则不止本文提到的3条规则,具体可以在“规则”中查看。在实际的项目开发中,用户可以直接选择“全面检查规则”来进行全方位的代码质量检测,以提升代码质量。

  W. Edwards Deming曾说过“Inspection is too late. Quality cannot be inspected into a product or servive. It must be built into it.”本质上,软件质量取决于工程师的意识、能力、方法与技能。然而,工程师的意识、能力、方法与技能需要不断提升。因而,华为云DevCloud代码检查服务在软件交付中仍然具有举足轻重的地位,不仅可以及时发现代码质量问题,而且可以强化工程师的预期行为,有助于提升工程师的意识、能力、方法与技能。

  

  

————————————————
版权声明:本文为CSDN博主「devopscsdn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/devopscsdn/article/details/97657313

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。