Android 静态代码扫描规则

阻塞

  1. 不可能的转换
  2. 使用equals()方法比较类型不通的数组
  3. 硬编码了数据库密码
  4. 性能 - URL的equals 和 hashCode 方法会被堵塞 http://michaelscharf.blogspot.com/2006/11/javaneturlequals-and-hashcode-make.html
  5. 性能 - URL的Maps 和 sets可能是性能大问题
  6. 错误用法 - close()调用了一个永远是null的值
  7. 错误用法 - equals方法一直返回false或者true
  8. 错误用法 - null值一定会被调用
  9. 错误用法 - 一个已知的null值被检测它是否是一个类型的实例
  10. 错误用法 - 集合转换为数组元素时发生的类型转换错误

严重

  1. Switch语句中一个case失败以后进入了下一个case
    忘记break;语句
  2. switch语句失败抛出异常导致无用的存储
    忘记break;语句,导致无用的对象存储

     String status = "";
     Switch(Type)
     case 1:
         status = "Hello Wolrd";
     case 2:
         status = "Hello new Wolrd";
    
  3. volatile的自增操作不是原子的
    java语言中++,--都不是原子操作,如果有多个线程同时操作该变量,会有问题
  4. 不良实践 - 怀疑进行了引用比较==
    ==用于简单数据的比较;如果用于对象,其实比较的是对象的内存地址。
  5. 不要catch Throwable
    Throwable是所以错误类的基类,Exception是所有异常类的基类,允许catch Exception,但是不允许捕获Throwable,否则连oom这种错误都不会抛出。
  6. 使用错误 - 使用equals()比较不同类型
  7. 性能 - keySet迭代是低效的,使用entrySet代替
    entrySet遍历方式获取Value对象是直接从Entry对象中直接获得,时间复杂度T(n)=o(1);
    keySet遍历获取Value对象则要从Map中重新获取,时间复杂度T(n)=o(n)
  8. 性能 - 方法在循环中使用+进行字符串拼接
    字符串String,实在内存中新开辟空间存储。推荐使用StringBuilder类。
  9. 无条件的if语句
    if(true)或者if(false)的情况
  10. 破坏的null检测 if(null==name || name.equals("Tom"))
  11. 高危 - 通过一个实例方法更新静态属性
  12. 错误用法 - 调用了null指针
  13. 高危 - 在两个switch语句或者分支中使用了相同的代码
  14. 高危 - 对一个已知不是null的值重复进行空值判断
  15. 高危 - 没有判断readLine()的结果是否为空
  16. 高危 - 未用的局部变量
  17. 多线程错误 - 同步static String可能导致死锁
    private static String username = "Hello world";
    
    public void doSomeThing()
    {
        synchronized(username)
        {
        ...
        }
    }
    
  18. 错误用法 - 可能出现空指针引用
  19. 性能 - 巨大的字符串常量在多个类文件中间重复了
  20. 高危 - 调用substring(0)会返回原值
版权声明

本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。

© 空空博客,本文链接:https://www.yeetrack.com/?p=1118