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)会返回原值

发表评论

电子邮件地址不会被公开。 必填项已用*标注

(Spamcheck Enabled)