美文网首页
Sonar---bug规则

Sonar---bug规则

作者: 小圆圈Belen | 来源:发表于2020-10-22 14:32 被阅读0次

    Sonar---漏洞规则:https://www.jianshu.com/p/d471b483652c
    Sonar---坏味道(异味)https://www.jianshu.com/p/b74f97134be0

    bug

    bug类型(本人理解,bug就是我们的研发同学需要修改的内容啦)
    1、".equals()" should not be used to test the values of "Atomic" classes.
    bug 主要
    不要使用equals方法对AtomicXXX进行是否相等的判断
    Atomic变量永远只会和自身相等,Atomic变量没有覆写equals()方法.
    2、"=+" should not be used instead of "+="
    bug 主要
    "=+" 与 "=+" 意义不同
    a =+ b;虽然正确但写法不合规,应写成 a = +b;
    3、"@NonNull" values should not be set to null
    bug 次要
    标注非空假定非空且在使用之前不进行非空检查,设置为空会导致空指针异常
    4、"BigDecimal(double)" should not be used
    bug 主要
    因为浮点的不精确,可能使用BigDecimal(double)得不到期望的值
    5、"compareTo" results should not be checked for specific values
    bug 次要
    compareTo可能返回不是具体的值(除0外),建议用 >0、<0、=0
    6、"compareTo" should not return "Integer.MIN_VALUE"
    bug 次要
    compareTo只代表一个不等标识,不代表不等的程度,应返回-1,0,1标识即可
    7、"Double.longBitsToDouble" should not be used for "int"
    bug 主要
    Double.longBitsToDouble返回给定的位所代表的double值,需要一个64位的long类型参数.
    8、 "equals" method overrides should accept "Object" parameters
    bug 主要
    equals作为方法名应该仅用于重写Object.equals(Object)来避免混乱.
    9、 "equals(Object obj)" should test argument type
    bug 次要
    要比较obj的class type是否一样
    10、"equals" methods should be symmetric and work for subclasses
    bug 次要
    equals应是对等并且在有子类参与时能正常工作
    11、"equals(Object obj)" and "hashCode()" should be overridden in pairs
    bug 次要
    成对重写
    12、"Externalizable" classes should have no-arguments constructors
    bug 主要
    Externalizable(可序列化与返序列化)类应该有无参构造器
    13、"getClass" should not be used for synchronization
    bug 主要
    {synchronized (this.getClass())} 错误 子类继承此方法时不能做到同步
    {synchronized (MyClass.class)} 正确
    14、"hashCode" and "toString" should not be called on array instances
    bug 主要
    使用Arrays.toString(args)和Arrays.hashCode(args)代替.
    15、"instanceof" operators that always return "true" or "false" should be removed
    bug 主要
    16、"InterruptedException" should not be ignored
    bug 主要

    try {
    while (true) {
    // do stuff
    }
    }catch (InterruptedException e) {
    LOGGER.log(Level.WARN, "Interrupted!", e);
    // Restore interrupted state...
    Thread.currentThread().interrupt();
    }
    

    17、"Iterator.hasNext()" should not call "Iterator.next()"
    bug 主要
    18、"Iterator.next()" methods should throw "NoSuchElementException"
    bug 次要

    public String next(){
    if(!hasNext()){
    throw new NoSuchElementException();
    }
    ...
    }
    

    19、"notifyAll" should be used
    bug 主要
    notify可能不能唤醒正确的线程,notifyAll代之。
    20、"null" should not be used with "Optional"
    bug 主要
    把判空包装起来使用而不直接使用!=null
    21、"PreparedStatement" and "ResultSet" methods should be called with valid indices
    bug 阻断
    PreparedStatement与ResultSet参数设置与获取数据由序号1开始而非0
    22、"read" and "readLine" return values should be used
    bug 主要
    BufferedReader.readLine(), Reader.read()及子类中的相关方法都应该先存储再比较

    buffReader = new BufferedReader(new FileReader(fileName));
    String line = null;
    while ((line = buffReader.readLine()) != null) {
    // ...
    }
    

    23、"runFinalizersOnExit" should not be called
    bug 严重
    JVM退出时不可能运行finalizers,System.runFinalizersOnExit 和 Runtime.runFinalizersOnExit可以在jvm退出时运行但是因为他们不安全而弃用.
    正确用法:

    Runtime.addShutdownHook(new Runnable() {
    public void run(){
    doSomething();
    }
    });
    

    24、"ScheduledThreadPoolExecutor" should not have 0 core threads
    bug 严重
    java.util.concurrent.ScheduledThreadPoolExecutor由属性corePoolSize指定线程池大小,如果设置为0表示线程执行器无线程可用且不做任何事.
    25、"Serializable" inner classes of non-serializable classes should be "static"
    bug 次要
    序列化非静态内部类将导致尝试序列化外部类,如果外部类不是序列化类,会产生运行时异常,内部类静态化会避免这种情况
    26、"SingleConnectionFactory" instances should be set to "reconnectOnException"
    bug 主要
    使用Spring SingleConnectionFactory而不启用reconnectOnException设置当连接恶化将阻止自动连接恢复。
    27、"StringBuilder" and "StringBuffer" should not be instantiated with a character
    bug 主要

    StringBuffer foo = new StringBuffer('x'); 错 equivalent to StringBuffer foo = new StringBuffer(120);
    StringBuffer foo = new StringBuffer("x"); 对
    

    28、 "super.finalize()" should be called at the end of "Object.finalize()" implementations
    bug 严重

    protected void finalize() {
    releaseSomeResources();
    super.finalize(); //调用,最后调用
    }
    

    29、"toArray" should be passed an array of the proper type
    bug 次要
    toArray()无参且强制类型转换会产生运行时异常,应传入一个合适的类弄作参数
    public String [] getStringArray(List<String> strings) {
    return strings.toArray(new String[0]);
    }
    30、"toString()" and "clone()" methods should not return null
    bug 主要
    可返回""
    31、 "wait" should not be called when multiple locks are held
    bug 阻断
    32、 "wait", "notify" and "notifyAll" should only be called when a lock is obviously held on an object
    bug 主要
    先要获得对象锁才能进行上述操作

    private void removeElement() {
    synchronized(obj) {
    while (!suitableCondition()){
    obj.wait();
    }
    ... // Perform removal
    }
    }
    or
    private synchronized void removeElement() {
    while (!suitableCondition()){
    wait();
    }
    ... // Perform removal
    }
    

    33、"wait(...)" should be used instead of "Thread.sleep(...)" when a lock is held
    bug 阻断
    当持有锁的当前线程调用Thread.sleep(...)可能导致性能和扩展性问题,甚至死锁因为持有锁的当前线程已冻结.合适的做法是锁对象wait()释放锁让其它线程进来运行.
    34、A "for" loop update clause should move the counter in the right direction
    bug 主要
    检查for循环下标递增或递减正确
    35、All branches in a conditional structure should not have exactly the same implementation
    bug 主要
    分支中不应该有相同的实现
    36、Blocks should be synchronized on "private final" fields or parameters
    bug 主要
    synchronized同步块应该锁在private final fields或parameters对象上,因为同步块内非final锁对象可能改变导致其它线程进来运行.
    37、Boxing and unboxing should not be immediately reversed
    bug 次要
    自动拆箱和装箱不需手动转换
    38、Child class methods named for parent class methods should be overrides
    bug 主要
    以下情况不是重写:
    a、父类方法是static的而子类方法不是static的
    b、子类方法的参数或返回值与父类方法不是同一个包
    c、父类方法是private
    为了不产生混乱,不要与父类方法同名
    39、Classes extending java.lang.Thread should override the "run" method
    bug 主要
    线程类应该重写run方法
    40、Classes should not be compared by name
    bug 主要
    不要用类名称比较类是否相同,而用instanceof或者Class.isAssignableFrom()进行底动类型比较
    41、Classes that don't define "hashCode()" should not be used in hashes
    bug 主要
    没有定义hashCode()方法的类不能作为hash集合中的键值,因为equal相同的实例对像可能返回不同的hash值.
    42、Collections should not be passed as arguments to their own methods
    bug 主要
    集合实例不应该作为参数被传给集合实你还自已的方法中
    43、Conditionally executed blocks should be reachable
    bug 主要
    条件执行块应该可达
    44、Constructor injection should be used instead of field injection
    bug 主要
    构造器注入应该替代属性注入(非Spring framework)
    因为任何非Spring framework实例化而是通过构造器实例化的实例不能注入属性,这样公有的构造器实化化后可能产生NullPointerException,除非所有的构造器都是私有的
    45、Consumed Stream pipelines should not be reused
    bug 主要
    流不应该重用
    46、Custom resources should be closed
    bug 阻断
    资源应该关闭
    47、Custom serialization method signatures should meet requirements
    bug 主要
    自定义类序列化方法签名应该合法
    49、Dependencies should not have "system" scope
    bug 严重
    maven依赖不要在system scope
    50、Dissimilar primitive wrappers should not be used with the ternary operator without explicit casting
    bug 主要
    不同的原始包装类如果没有明确的类转换不能用于三元操作中
    51、Double Brace Initialization should not be used
    bug 次要
    双构造初始不要用

    Map source = new HashMap(){{ // Noncompliant
    put("firstName", "John");
    put("lastName", "Smith");
    }};
    

    此操作如一个anonymous inner class,如果anonymous inner class返回且被其它对象引用,可能产生memory leaks,既使不产生memory leaks也会让大多维护者感到迷惑
    52、Double-checked locking should not be used
    bug 阻断
    重复检查的锁块不要使用

    public static Resource getInstance() {
    if (resource == null) {
    synchronized (DoubleCheckedLocking.class) {
    if (resource == null)
    resource = new Resource();
    }
    }
    return resource;
    }
    应
    public synchronized static Resource getInstance() {
    if (resource == null)
    resource = new Resource();
    return resource;
    }
    

    53、Equals Hash Code
    bug 严重
    成对重写equals()与hashCode()
    54、Exception should not be created without being thrown
    bug 主要
    不被抛出的异常不要创建
    55、Expressions used in "assert" should not produce side effects
    bug 主要
    assert表达式不要产生负影响,不要改变数据状态
    56、Failed unit tests should be fixed
    bug 主要
    失败的单元测试应该尽快解决掉
    57、Floating point numbers should not be tested for equality
    bug 主要
    浮点数不要进行比较
    58、Getters and setters should be synchronized in pairs
    bug 主要
    get与set应该成对进行同步操作
    59、Identical expressions should not be used on both sides of a binary operator
    bug 主要
    相同的表达式不要作为二进制操作的操作数使用,应该简化
    60、Inappropriate "Collection" calls should not be made
    bug 主要
    正确使用集合元素类型
    61、Inappropriate regular expressions should not be used
    bug 主要
    正确使用正则表达式
    62、Intermediate Stream methods should not be left unused
    bug 主要
    中间流应该被使用
    63、Ints and longs should not be shifted by zero or more than their number of bits-1
    bug 次要
    整型与长整型位移操作数应该价于1与类型占位数-1
    64、Invalid "Date" values should not be used
    bug 主要
    正确使用日期
    65、Jump statements should not occur in "finally" blocks
    bug 主要
    finally块中使用return, break, throw等Jump statements,会阻止在try catch中抛出的未处理异常的传播
    66、Locks should be released
    bug 严重
    保证锁的能够释放
    67、Loop conditions should be true at least once
    bug 主要
    循环应该至少走一次
    68、Loops should not be infinit
    bug 阻断
    循环不应该死循环
    69、Math operands should be cast before assignment
    bug 次要
    数字操作在操作或赋值前要转化
    70、Math should not be performed on floats
    bug 次要
    BigDecimal代替floats进行大数精确运算
    71、Methods "wait(...)", "notify()" and "notifyAll()" should not be called on Thread instances
    bug 阻断
    不要在线程中使用"wait(...)", "notify()" and "notifyAll()"
    72、Methods should not be named "hashcode" or "equal"
    bug 主要
    除非Override重写这些方法
    73、Multiline blocks should be enclosed in curly braces
    bug 主要
    多列块应用大括号括起来
    74、Neither "Math.abs" nor negation should be used on numbers that could be "MIN_VALUE"
    bug 次要
    不要对数值类型的MIN_VALUE值或返回值为此值进行Math.abs与取反操作,因为不会起作用。
    75、Non-public methods should not be "@Transactional"
    bug 主要
    非public方法不要注解Transactional,调用时spring 会抛出异常
    76、Non-serializable classes should not be written
    bug 主要
    执行写操作的类要序列化,否则会抛出异常
    77、Non-serializable objects should not be stored in "HttpSession" objects
    bug 主要
    HttpSession要保存序列化的对象
    78、Non-thread-safe fields should not be static
    bug 主要
    非线程安全的域不应该静态化
    79、Null pointers should not be dereferenced
    bug 主要
    空指针引用不应被访问
    80、Optional value should only be accessed after calling isPresent()
    bug 主要
    Optional实例值的获取要isPresent()之后再做操作
    90、Printf-style format strings should not lead to unexpected behavior at runtime
    bug 阻断
    因为Printf风格格式化是在运行期解读,而不是在编译期检验,会存在风险
    91、Raw byte values should not be used in bitwise operations in combination with shifts
    bug 主要
    原始字节值不应参与位运算
    result = (result << 8) | readByte(); // Noncompliant
    正:
    result = (result << 8) | (readByte() & 0xff);
    92、Reflection should not be used to check non-runtime annotations
    bug 主要
    反射操作不应该运于检查非运行时注解
    93、Related "if/else if" statements should not have the same condition
    bug 主要
    if/else if中不应该有相同的条件
    94、Resources should be closed
    bug 阻断
    打开的资源应该关闭并且放到finally块中进行关闭
    95、Return values from functions without side effects should not be ignored
    bug 主要
    操作对函数返回值没有影响的应该忽略

    public void handle(String command){
    command.toLowerCase(); // Noncompliant; result of method thrown away
    ...
    }
    

    96、Servlets should not have mutable instance fields
    bug 主要
    servlet容器对每一个servlet创建一个实例导致实例变量共享产生问题
    struts1.x 也是单例
    97、Short-circuit logic should be used to prevent null pointer dereferences in conditionals
    bug 主要
    应正确使用短路逻辑来防止条件中的空指针引用访问
    98、Silly equality checks should not be made
    bug 主要
    愚蠢的相等检查不应该做
    非同类型的对象equal
    99、Spring "@Controller" classes should not use "@Scope"
    bug 主要
    保持spring controller的单例
    100、Synchronization should not be based on Strings or boxed primitives
    bug 主要
    字符串和封箱类不应该被用作锁定对象,因为它们被合并和重用。
    101、The non-serializable super class of a "Serializable" class should have a no-argument constructor
    bug 次要
    序列化的类的非序列化父类应有一个无参构造器
    102、The Object.finalize() method should not be called
    bug 主要
    Object.finalize()不要人为去调用
    103、The Object.finalize() method should not be overriden
    bug 主要
    Object.finalize()不要重写
    104、The signature of "finalize()" should match that of "Object.finalize()"
    bug 主要
    Object.finalize()不要重写
    105、The value returned from a stream read should be checked
    bug 次要
    从流中读取的值应先检查再操作
    106、Thread.run() should not be called directly
    bug 主要
    调用start()
    107、Useless "if(true) {...}" and "if(false){...}" blocks should be removed
    bug 主要
    无用的if(true)和if(false)块应移除
    108、Value-based classes should not be used for locking
    bug 主要
    基于值的类不要用于锁对象
    109、Value-based objects should not be serialized
    bug 次要
    基于值的对象不应被用于序列化
    110、Values should not be uselessly incremented
    bug 主要
    值增减后不存储是代码浪费甚至是bug
    111、Variables should not be self-assigned
    bug 主要
    变量不应该自分配如下:
    public void setName(String name) {
    name = name;
    }
    112、Week Year ("YYYY") should not be used for date formatting
    bug 主要
    日期格式化错误
    113、Zero should not be a possible denominator
    bug 严重
    零不应该是一个可能的分母
    114、Loops should not be infinite
    Bug 阻断
    循环不应该是无限的

    相关文章

      网友评论

          本文标题:Sonar---bug规则

          本文链接:https://www.haomeiwen.com/subject/vkoumktx.html