object-静态代码扫描

什么是静态代码扫描

它是指在软件工程中,程序员在写好源代码后,无需经过编译器编译,而直接使用一些扫描工具对其进行扫描,找出代码当中存在的一些语义缺陷、安全漏洞的解决方案。目前的静态扫描技术已经从90年代时候的,编码规则匹配这种由编译技术拓展过来的分析技术向程序模拟全路径执行的方向发展,由此,这种模拟执行相对的执行路径比动态执行更多,能够发现很多动态测试难以发现的缺陷。

静态代码扫描价值

  1. 研发过程,发现BUG越晚,修复的成本越大;
  2. 缺陷引入的大部分是在编码阶段,但发现的更多是在单元测试、集成测试、功能测试阶段;
  3. 统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。

静态代码扫描工具:Facebook的infer 代码静态检测

infer 优点:

1、效率高、规模大,几分钟能扫描上千行代码;
2、支持增量及非增量分析;
3、分解分析,输出整合结果(infer能将代码分解,小范围分析后再将结果整合在一起,兼顾分 析的深度和速度) ;
在 iOS 和 C 中,infer 能捕捉的 bug 类型有:
1、资源泄漏;
2、内存泄漏;
3、null 引用;
4、Premature nil termination argument 
只在 OC 中捕捉的 bug 类型有:
1、循环引用(Retain cycle);
2、参数非空检查;
3、实例变量非空检查;
出现常见错误类型有:
1、NULL_DEREFERENCE:空指针的情况。
1.传参为0的情况下。例如代码中,在调用showAlertViewA()时,将tag传参为0,infer检测此处传0,判断为一个NULL空指针,所以爆出警告。这里可以理解为误报,不会出现问题。
2.通过malloc,calloc,realloc等函数申请内存,当内存不足时,有可能会在该函数中返回NULL,如果没有做NULL的判断,则警告
3.在创建NSArray或者NSDictionary时,传入的参数有可能会nil。由于NSArray与NSDictionary不接受空指针,所以在对其addObject或者setObject:forKey: 时需要进行判断一下是否为nil
2、MEMORY_LEAK:内存泄漏:
 项目代码全面启动了ARC进行内存管理,在OC层没有扫描出内存泄露。目前扫描出的内存泄露问题都是使用了malloc或者ralloc等c语言内存申请函数,在函数提前return前没有及时free
3、RESOURCE_LEAK:资源泄漏
4、ASSIGN_POINTER_WARNING
  由于在mrc时代,没有weak指针,所以一些view的属性声明是_、unsafe__unretain__的形式,在arc中,这个属性被判断为assign,需要将其修改为weak或者strong
5、DIRECT_ATOMIC_PROPERTY_ACCESS
  在代码中使用了使用了一个atomic的成员变量,infer建议我们将atomic修改为nonatomic。由于OC中,属性会被默认设置为atomic属性,我们需要显示将属性声明为nonatomic。
6、IVAR_NOT_NULL_CHECKED    
  在代码中调用block,运行代码时,没有做判空处理。即需要改动为,if(block){block()}
7、BAD_POINTER_COMPARISON
  没有判断一个NSNumber类型的对象是不是空?
8、TAINTED_VALUE_REACHING_SENSITIVE_FUNCTION
  代码中使用了cookie的value。可以理解为误报
9、PARAMETER_NOT_NULL_CHECKED
  传参时没有判断是否为null,加一次判断就可以了
10、STRONG_DELEGATE_WARNING
  将一个delegate属性设置为strong的类型。
11、PREMATURE_NIL_TERMINATION_ARGUMENT
  没有判断是否为空
12、REGISTERED_OBSERVER_BEING_DEALLOCATED
  创建一个对象后,监听了某些通知,但是没有在dealloc中释放该通知。项目中出现这种问题的类,基本都是单例,不会被销毁。
  13、DEAD_STORE :变量或方法未使用

安装infer

终端指令: brew insatll infer
安装成功之后,输入 infer --version 来查看版本号:
安装xcpretty
终端指令: gem install xcpretty
Infer分析步骤分为两部
终端cd 到项目工程目录
1 根据xcodebuild生成compile_commands.json 此过程大概需要30分钟左右
终端指令: infer – xcodebuild -target test(这里是项目target名称) -configuration Debug -sdk iphonesimulator
2 然后根据infer生成分析文件
终端指令: infer --keep-going --compilation-database compile_commands.json
打开文件 infer-out -> bugs.txt 查看具体分析详情

参考链接:https://www.wandouip.com/t5i395946/
官方链接:https://infer.liaohuqiu.net
具体使用方法demo:https://www.jianshu.com/p/fd1923cc87eb

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值