Display 重复了,删除掉一个。

[](()16.Unexpected unknown type selector “element”

空样式,直接删除掉。

[](()17. Change this condition so that it does not always evaluate to “false”

(更改此条件,以便它不总是评估为“false")

这是很多webservice文件中出现的一个bug。 如果后期会对webservice文件过滤,这个就可以不管了。不过也可以把这行删除掉,obj不可能为null if (obj == null) return false; 这样这个bug也没有了。

[](()二 漏洞

[](()1.Use a logger to log this exception

这种提示就是异常应该用日志打印出来。

[](()2.‘password’ detected in this expression, review this potentially hard-coded credential

提示密码不能直接这样传递,不安全。但是也没有提供参考的案例。所以我是这样的改的,也能消除漏洞。如下图:

[](()3.Make areaList a static final constant or non-public and provide accessors if needed

类变量字段不应具有公共可访问性。所以把public访问修饰符,改成其他的修饰符,最好是private.

[](()4.Secure this “Transformer” by either disabling external DTDs or enabling secure processing.

提示应该保护XML变换器。创建javax.xml.transform.Transformer但未启用“安全处理”或创建一个而不禁用外部DTD时,可能会发生XML外部实体或XSLT外部实体(XXE)漏洞。 如果该外部实体被攻击者劫持,则可能导致机密数据泄露,拒绝服务,服务器端请求伪造,从解析器所在机器的角度进行端口扫描,以及其他系统影响。

进行修改如下可以消除漏洞:

[](()5.Do something with the “boolean” value returned by “delete”.

提示当包含操作状态代码时,不应忽略返回值。也就是说不应该忽略文件删除操作的结果。

所以进行如下修改,但是如下修改虽然修复了漏洞,但是新增了异味。

异味提示"java.nio.Files#delete" should be preferred (squid:S4042)。应该使用Files.delete()方法,而不能之间文件delete.所以最后修改成:

[](()6.Make this “public static userInfoUrl” field final

这种“public static”字段应该成员变量应该是不变的,所以需要加上final修饰,如下:

还有几种漏洞不好修复,暂时没有思路

[](()7.Change this method so it throws exceptions

这种提示,TrustManagers不应盲目接受任何证书。通常会创建X509TrustManager接口的空实现,以允许连接到未由根证书颁发机构签名的主机。 这样的实现将接受任何证书,这使得应用程序容易受到中间人攻击。 正确的解决方案是提供适当的信任存储。

[](()8.Use the recommended AES (Advanced Encryption Standard) instead.

这种原来用DES加密的提示不应使用DES(数据加密标准)和DESede(3DES)。它推荐的使用AES.但是将DES加密改成AES加密虽然程序异味消除了,但是程序肯定不对吧,加密方式换了肯定会出问题的吧。

[](()三 异味

异味太多了,我也没有消除太多了异味,一个项目异味一般都是好几k,所以消除起来一两个异味对基数没有什么影响,并且异味太多,消除一部分后,并没有感受到那种异味数量巨减的感觉,导致消除异味的积极性不是很高。并且有的异味是真的不好消除,有时候打开一个文件,几千行代码一片都是标异味。直接就放弃了。

[](()1.Replace the type specification in this constructor call with the diamond operator (“<>”).

Java 7引入了菱形运算符(<>)来减少泛型代码的冗长。 例如,您现在可以使用<>简化构造函数声明,而不必在其声明及其构造函数中声明List的类型,编译器将推断该类型。如下:

[](()2.Add a default case to this switch

swatch 中没有default,也没有break;虽然上面的代码不要break也不会有什么问题。但是万一哪天变了,不是return 就很容易出错了吧。

[](()3.Remove this empty statement.

两个分号,代码中有很多地方有这种情况感觉,删掉多余的。

[](()4.Remove this useless assignment to local variable “XXX”.

上图,定义的变量但是没有使用,就会抛出这种异味,解决这种异味,是需要看看这个变量有什么作用,没有作用的可以删除掉,如果不改随意改动,可以在他们下面增加一条日志打印他们,这样也能消除这个异味。

[](()5.Directly append the argument of String.valueOf().

String.valueOf()不应附加到String。这里我的理解是,result是string类型,arerType是int类型,在拼接的时候会自动的将int类型转换成string,不用多此一举。

[](()6.Define a constant instead of duplicating this literal “XXXX” 4 times.

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】

类似这种,当一个不变的字符串在一个文件中多次出现,就应该给这些字符串提取成常量,这样方便以后修改和维护。但是说实话提取常量这个异味真的很枯燥,并且代码中有大量的这种情况,感觉每个项目或者每个模块都应该提取一个常量类,这样这个模块用到这些不变字符串,就直接从这个类中获取,但是这个工作量有点大哈哈,我就简单的尝试了一下,把自定义报表那部分提取常量,但是进行了一部分就没有进行下去了,枯燥且工作量大

但是我觉得这个工作还是做比较好,这样便于以后的维护,常量值改变只用改一个地方就好了,不用所有地方都修改。

[](()7.Use a StringBuilder instead.

当字符串需要频繁变化时,用stringBuilder代替string .这里还有一种异味是代码中有的地方用的是StringBuffer,也需要转成StringBuilder.因为Stringbuffer是确保线程安全的,stringBuilder

不用,所以stringBuilder效率更高。那会不会引发线程安全问题呢,不会,因为这个是在方法内部定义的变量,所以对这个方法而言是线程封闭的,不会引发线程安全问题。

[](()8.Reorder the modifiers to comply with the Java Language Specification.

提示修饰符的顺序应该符合java语言规范,它给出的参考如下:

所以把static修饰符 放到final就好了。

[](()9.Declare “XXX” on a separate line.

定义变量的时候,一个变量一行,便于查看

[](()10.Return an empty collection instead of null.

最好不要直接返回null,应返回空数组和集合.如下:

[](()11.Use isEmpty() to check whether the collection is empty or not.

判断集合时候为空是,不要使用size(),建议使用isEmpty()方法。如下:

[](()12.This block of commented-out lines of code should be removed

这种可以直接删除掉,或者不想删除的可以用/***/注释,对于单行的可以把后面的分号去掉就不会报错异味了。

[](()13.Remove the literal “false” boolean value

布尔文字不应该是多余的。用true或者false在if中判断是不好的写好,直接可以通过本身进行判断,如下:

[](()14.Add a private constructor to hide the implicit public one.

如果一个类的里面的方法都是static修饰的静态方法,那么需要给这个类定义一个非公共构造函数(添加私有构造函数以隐藏隐式公共构造函数)如下:

[](()15.Refactor this method to reduce its Cognitive Complexity from 55 to the 15 allowed.

关于代码圈复杂度大于15的异味,以及代码过长的异味,说实话也没有什么好的方法,只能读代码,然后抽离函数出来,当然抽离函数不可能一次就能做到代码简洁之道要求的那样,一个函数只做一件事,单一层次原则。但是我们也不能因为做不到这样就就什么都不做,还是要迈出这一步,先抽离函数,虽然没有做到单一层次原则,但是消除了异味。下面代码是对上面的进行简单的函数抽离,消除异味

[](()16.关于代码中很多的stitch分支问题。

这样代码上看去显得非常的臃肿且感觉特别low,但是这却是我们最喜欢写的包括我自己,因为简单进本不用思考。并且如下图,18个case都没有报异味,所以SonarQube上也没有检查出来,所以大家都将就先改其他,后来被数据端同事看到了下面这个代码,说代码简洁之道不是说不能用这么多的swatch么?我竟然一时不知道怎么回答,只能说修改成本太大,不好改。但是事后自己仔细想想自己接受这段代码看的也感觉特别low,那自己为什么不能对自己的要求高一点呢,所以痛定思痛打算改这段代码。

我修改这部分代码采用的是枚举类型,先创建一个枚举,并将所有的case换成对应的枚举值,然后创建两个成员变量和一个带两个参数的枚举的构造方法。然后实现这两个成员变量的get方法,使得其他类可以访问。如下图:

然后在原来的swatch的代码中,删除这些分支,创建这个枚举,并根据分支创建对应的枚举值,如下:

这样就完成啦,看起来总算比那么多的swatch-case舒服很多吧,并且也没有那么low了。

[](()17.还有一些其他的异味消除。直接贴图

两个分支一模一样的,需要删掉其中一个。然后像这种有很多if-else if的getsql()方法的圈复杂度肯定是超过了,这里比较好的方法我也不知道怎么做,但是我是将整个分成多个一样的if-else if的方法。但是这样只能消除异味,代码的可读性变差。

SonarQube检测出的bug、漏洞以及异味的修复整理相关推荐

  1. NR-PRACH接受端如何检测出preambleid和TA的

    PRACH就是利用了ZC序列的两个特点: 1.ZC序列具有恒定的振幅,经过DFT过后也是恒定振幅, 这样就限制了峰均比对其他用户的产生的边界和时间平坦性的影响,在计算过程中只需要考虑相位,不需要考虑振 ...

  2. 软件测试qq是不是微信号,如何批量检测出QQ号是否开通微信?

    对于线上营销人员而言,每天添加新的微信用户,来扩大自己的客户圈子已经是习惯了,很多营销人员都是通过寻找目标QQ群,然后在批量的添加QQ群成员,本来通过批量添加QQ号来增加微信好友,是可以节省很多时间的 ...

  3. 使用describe()查看catering_sale.xls数据的基本情况,通过箱式图检测出catering_sale.xls中的异常值

    使用describe()查看catering_sale.xls数据的基本情况 import numpy as np import pandas as pd a=pd.read_excel('C:\\U ...

  4. Bash bug漏洞目前最新最全的修复方式

    为什么80%的码农都做不了架构师?>>>    Bash bug漏洞已经爆过2天时间,安全狗安全团队已经第一时间向广大用户进行预警.但由于Bash在Linux系统的广泛应用导致众多L ...

  5. 常见WEB漏洞问题危害及修复建议

    漏洞检测工具用语说明 一,高危漏洞 高危漏洞包括SQL注入漏洞.XSS跨站脚本漏洞.页面存在源代码泄露.网站存在备份文件.网站存在包含SVN信息的文件.网站存在Resin任意文件读取漏洞. SQL注入 ...

  6. 微信被爆出存在高危漏洞!新版本已修复,看到的更新一下!

    来源:Java面试那些事儿 微信被国内某安全团队爆出,在PC版客户端中捕获到一个高危等级的在野0day漏洞.建议3.2.1.141版本以下的用户立即更新! 此次被爆出的高危0day黑客只需要通过微信发 ...

  7. WEB常见漏洞问题危害及修复建议

    漏洞检测工具用语有高危漏洞,中危漏洞,低危漏洞以及漏洞的危害介绍,本文介绍的非常详细,具有参考解决价值,感兴趣的朋友一起看看吧 漏洞检测工具用语说明 一,高危漏洞 高危漏洞包括SQL注入漏洞.XSS跨 ...

  8. 预防xml注入漏洞攻击_预防性编程-漏洞发生前如何修复

    预防xml注入漏洞攻击 by Kurt 由库尔特 福尔摩斯(Sherlock Holmes)本来是个出色的程序员 (Sherlock Holmes would have been a brillian ...

  9. linux缓存文件用户权限错误,CVE-2019-11244漏洞到底该如何修复?--关于缓存文件权限设置...

    2019年5月,Kubernetes社区(后面简称"社区")修复了标号为CVE-2019-11244的安全漏洞,这个修复方案似乎并不彻底,于是有人发布Issue对此提出异议,希望提 ...

  10. D-Link 老款路由器被曝多个高危漏洞,未完全修复

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 D-Link 称,在 DIR-865L无线路由器中发现一个严重的命令注入漏洞,可导致用户易受拒绝服务攻击,并督促用户停止使用该产品. ...

最新文章

  1. C# 关于密码加密 (转载)
  2. 动态规划——骨牌平铺问题
  3. php乱码解决方案,PHP中文乱码解决方案
  4. Spring集成Redis集群(含spring集成redis代码)
  5. 数字人民币这一年,互联网企业做了什么?
  6. 区块链相关名词解释(一)
  7. AndroidStudio与eclipse打包的时候报错。Error:(4) Error: ssdk_instapager_login_html is not translated in......
  8. c++单例模式Singleton Pattern
  9. SIP - FreeSwitch 安装 编译
  10. php 轮播代码生成器,阿里巴巴国际站全屏轮播代码生成器 阿里国际站全屏轮播切换代码阿里巴巴全屏轮播怎么做? 一秒钟美工助手官方网站...
  11. 录制计算机课,ClassIn怎么录制视频 录课操作步骤
  12. Excel2013 单元格锁定
  13. MySQL大批量造数据
  14. 石头机器人拖地水量调节_用石头扫地机器人扫地拖地是一种什么体验
  15. 【深度学习】吴恩达深度学习-Course1神经网络与深度学习-第四周深度神经网络的关键概念编程(下)——深度神经网络用于图像分类:应用
  16. 行为识别之slowfast
  17. 389-MySQL数据库代码封装
  18. 【Exceptions】Flowchart is not a function / null is not an object
  19. 国家推动云计算等IT服务和电子商务加快发展
  20. facebook诞生记-摘要

热门文章

  1. 查询-非等值连接,外连接,子查询
  2. 小程序顶部标题栏的背景图片设置
  3. rc列联表_推荐一款轻便的RC列联表卡方统计
  4. 一次蜿蜒曲折的RFID破解之路
  5. 工地人脸识别门禁考的出现对智慧工地提出解决方案
  6. DevOps前沿技术培训课程大纲
  7. 利用Word2Vec模型训练Word Embedding,并进行聚类分析
  8. 预售┃让苹果CEO库克折服的程序员仅10岁!?
  9. C#的get和set用法
  10. 利用 Python 进行量化投资分析 - 利率及风险资产的超额收益