iOS开发高手课
戴铭
前滴滴出行技术专家
立即订阅
11464 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 锚定一个点,然后在这个点上深耕
免费
基础篇 (20讲)
01 | 建立你自己的iOS开发知识体系
02 | App 启动速度怎么做优化与监控?
03 | Auto Layout 是怎么进行自动布局的,性能如何?
04 | 项目大了人员多了,架构怎么设计更合理?
05 | 链接器:符号是怎么绑定到地址上的?
06 | App 如何通过注入动态库的方式实现极速编译调试?
07 | Clang、Infer 和 OCLint ,我们应该使用谁来做静态分析?
08 | 如何利用 Clang 为 App 提质?
09 | 无侵入的埋点方案如何实现?
10 | 包大小:如何从资源和代码层面实现全方位瘦身?
11 | 热点问题答疑(一):基础模块问题答疑
12 | iOS 崩溃千奇百怪,如何全面监控?
13 | 如何利用 RunLoop 原理去监控卡顿?
14 | 临近 OOM,如何获取详细内存分配信息,分析内存问题?
15 | 日志监控:怎样获取 App 中的全量日志?
16 | 性能监控:衡量 App 质量的那把尺
17 | 远超你想象的多线程的那些坑
18 | 怎么减少 App 电量消耗?
19 | 热点问题答疑(二):基础模块问题答疑
20 | iOS开发的最佳学习路径是什么?
应用开发篇 (12讲)
21 | 除了 Cocoa,iOS还可以用哪些 GUI 框架开发?
22 | 细说 iOS 响应式框架变迁,哪些思想可以为我所用?
23 | 如何构造酷炫的物理效果和过场动画效果?
24 | A/B 测试:验证决策效果的利器
25 | 怎样构建底层的发布和订阅事件总线?
26 | 如何提高 JSON 解析的性能?
27 | 如何用 Flexbox 思路开发?跟自动布局比,Flexbox 好在哪?
28 | 怎么应对各种富文本表现需求?
29 | 如何在 iOS 中进行面向测试驱动开发和面向行为驱动开发?
30 | 如何制定一套适合自己团队的 iOS 编码规范?
31 | iOS 开发学习资料和书单推荐
32 | 热点问题答疑(三)
原理篇 (6讲)
33 | iOS 系统内核 XNU:App 如何加载?
34 | iOS 黑魔法 Runtime Method Swizzling 背后的原理
35 | libffi:动态调用和定义 C 函数
36 | iOS 是怎么管理内存的?
37 | 如何编写 Clang 插件?
38 | 热点问题答疑(四)
原生与前端共舞 (5讲)
39 | 打通前端与原生的桥梁:JavaScriptCore 能干哪些事情?
40 | React Native、Flutter 等,这些跨端方案怎么选?
41 | 原生布局转到前端布局,开发思路有哪些转变?
42 | iOS原生、大前端和Flutter分别是怎么渲染的?
43 | 剖析使 App 具有动态化和热更新能力的方案
用户故事 (1讲)
用户故事 | 我是如何学习这个专栏的?
结束语 (1讲)
结束语 | 慢几步,深几度
iOS开发高手课
登录|注册

07 | Clang、Infer 和 OCLint ,我们应该使用谁来做静态分析?

戴铭 2019-03-26
你好,我是戴铭。
随着业务开发迭代速度越来越快,完全依赖人工保证工程质量也变得越来越不牢靠。所以,静态分析,这种可以帮助我们在编写代码的阶段就能及时发现代码错误,从而在根儿上保证工程质量的技术,就成为了 iOS 开发者最常用到的一种代码调试技术。
Xcode 自带的静态分析工具 Analyze,通过静态语法分析能够找出在代码层面就能发现的内存泄露问题,还可以通过上下文分析出是否存在变量无用等问题。但是,Analyze 的功能还是有限,还是无法帮助我们在编写代码的阶段发现更多的问题。所以,这才诞生出了功能更全、定制化高、效率高的第三方静态检查工具。比如,OCLint、Infer、Clang 静态分析器等。
一款优秀的静态分析器,能够帮助我们更加全面的发现人工测试中的盲点,提高检查问题的效率,寻找潜在的可用性问题,比如空指针访问、资源和内存泄露等等。
同时,静态分析器还可以检查代码规范和代码可维护性的问题,根据一些指标就能够找出哪些代码需要优化和重构。这里有三个常用的复杂度指标,可以帮助我们度量是否需要优化和重构代码。
圈复杂度高。圈复杂度,指的是遍历一个模块时的复杂度,这个复杂度是由分支语句比如 if、case、while、for,还有运算符比如 &&、||,以及决策点,共同确定的。一般来说,圈复杂度在以 4 以内是低复杂度,5 到 7 是中复杂度,8 到 10 是高复杂度,11 以上时复杂度就非常高了,这时需要考虑重构,不然就会因为测试用例的数量过高而难以维护。
而这个圈复杂度的值,是很难通过人工分析出来的。而静态分析器就可以根据圈复杂度规则,来监控圈复杂度,及时发现代码是否过于复杂,发现问题后及早解决,以免造成代码过于复杂难以维护。
NPath 复杂度高。NPath 度量是指一个方法所有可能执行的路径数量。一般高于 200 就需要考虑降低复杂度了。
NCSS 度量高。NCSS 度量是指不包含注释的源码行数,方法和类过大会导致代码维护时阅读困难,大的 NCSS 值表示方法或类做的事情太多,应该拆分或重构。一般方法行数不过百,类的行数不过千。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《iOS开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(35)

  • Roger
    给宝宝喂夜奶,顺便来看看新的一课讲什么
    2019-03-26
    20
  • iLearn
    老师,Swift的要怎么搞?

    作者回复: SwiftLint

    2019-03-26
    15
  • drunkenMouse
    1. OClint 想执行自己指定的项目,还是不会。。最后查了别的资料,说是要写脚本安装xcpretty,而且说是不维护了。

    2. CLang 静态分析器的clang —analyze -Xclang -analyzer-checker-help 我执行之后,并没有成功显示常用的Checker。。

    3. Clang 静态分析器的lib/StaticAnalyzer/Checkers这个路径也没有找到,是不是换地方了?

    4. OClint、Clang静态分析器与Infer 都需要Clang编译器的LLVM对源码做词法、语法上的分析生成AST(一种静态语法树,代码更精简,遍历更轻松),然后对生成的AST做静态分析,达到编译代码层面的分析。

    5. OCLint说是不维护了,所以除了规则太多导致的重点找不到,可定制性过高导致的易用性变差外,也PASS(其实我对这句规则多所以XX的理解感受不是很深。。)

    Clang静态分析器,规则少只能检策较大问题,对内存泄漏一类问题若无错误也不提示外,回调次数也多。每执行一句,都要回调所有的Checker的回调函数。所以PASS

    Infer 定制性不是最高,但是不差。可以小范围分析,所以效率高。还支持增量分析(使用已缓存数据,非增量会清楚缓存)。所以,建议Infer
    2019-03-27
    13
  • yb坏蛋biubiu
    clang作为llvm编译器前端,进行预编译、词法分析生成token片、语法分析生成AST后,提供一个切面,开发者可以在这里利用clang生成的AST语法树进行自定义规则遍历分析,clang也提供了相应的checker和抛出诊断异常的diagnosis。
    2019-03-26
    5
  • 快到碗里来
    infer扫描单个文件 报错
    7 errors generated.
    Error: the following clang command did not run successfully:
        /usr/local/Cellar/infer/0.15.0/lib/infer/facebook-clang-plugins/clang/install/bin/clang
        @/var/folders/j_/tb3f_ly50rj_qylmtk1h8k2w0000gn/T/clang_command_.tmp.11b92e.txt
      ++Contents of '/var/folders/j_/tb3f_ly50rj_qylmtk1h8k2w0000gn/T/clang_command_.tmp.11b92e.txt':
        "-cc1" "-load"
        "/usr/local/Cellar/infer/0.15.0/lib/infer/infer/bin/../../facebook-clang-plugins/libtooling/build/FacebookClangPlugin.dylib"
        "-add-plugin" "BiniouASTExporter" "-plugin-arg-BiniouASTExporter" "-"
        "-plugin-arg-BiniouASTExporter" "PREPEND_CURRENT_DIR=1"
        "-plugin-arg-BiniouASTExporter" "MAX_STRING_SIZE=65535" "-cc1" "-triple"
        "x86_64-apple-macosx10.14.0" "-Wdeprecated-objc-isa-usage"
        "-Werror=deprecated-objc-isa-usage" "-emit-obj" "-mrelax-all"
        "-disable-free" "-disable-llvm-verifier" "-discard-value-names"
        "-main-file-name" "RootVC.m" "-mrelocation-model" "pic" "-pic-level" "2"
        "-mthread-model" "posix" "-mdisable-fp-elim" "-masm-verbose"
        "-munwind-tables" "-target-cpu" "penryn" "-dwarf-column-info"
        "-debugger-tuning=lldb" "-target-linker-version" "351.8"

        "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk"
        "-include"
        "/usr/local/Cellar/infer/0.15.0/lib/infer/infer/bin/../lib/clang_wrappers/global_defines.h"
        "-Wno-ignored-optimization-argument" "-Wno-everything"
        "-fdebug-compilation-dir" "/Users/mingzhi.liu/Desktop/TON/TON"
        "-ferror-limit" "19" "-fmessage-length" "0" "-stack-protector" "1"
        "-fblocks" "-fencode-extended-block-signature"
        "-fobjc-runtime=macosx-10.14.0" "-fobjc-exceptions" "-fexceptions"
        "-fmax-type-align=16" "-fdiagnostics-show-option" "-o" "RootVC.o" "-x"
        "objective-c" "RootVC.m" "-O0" "-include"
        "/usr/local/Cellar/infer/0.15.0/lib/infer/infer/bin/../lib/clang_wrappers/global_defines.h"
        "-Wno-everything"
    2019-04-19
    3
  • Yestin Zhao🏀
    fatal error: 'Foundation/Foundation.h' file not found 这么解决👇
    infer -- clang -c -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk Hello.m
    2019-04-09
    3
  • 寻心
    这个问题有谁遇到吗?
    怎么解决?
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    Internal Error: /usr/local/Cellar/infer/0.15.0/lib/infer/infer/bin/../lib/python/infer.py
      -j 4 --project-root /Users/yy/工作/项目/test --out
      /Users/yy/工作/项目/test/infer-out -- xcodebuild build -scheme test
      -workspace test.xcworkspace -configuration Debug -sdk iphonesimulator:
      exited with code 1
    Error backtrace:
    Raised at file "base/Die.ml" (inlined), line 25, characters 6-36
    Called from file "base/Logging.ml", line 314, characters 58-80
    Called from file "integration/Driver.ml", line 159, characters 2-16
    Called from file "integration/Driver.ml", line 280, characters 6-420
    Called from file "infer.ml", line 20, characters 2-36
    Called from file "infer.ml", line 130, characters 8-54

    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    2019-04-04
    3
  • mosn
    infer --skip-analysis-in-path Pods
    2019-04-08
    2
  • 简生
    个人觉得虽然OCLint检测规则多,易用性没有Infer好。但是Sonar+OCLint可以对检测结果进行一个可视化的管理,还是会偏向于选择OCLint。😊
    2019-03-30
    2
  • 吴小安
    infer 扫描怎么过滤不想扫描的文件呢,例如pod
    2019-03-29
    2
  • drunkenMouse
    关于brew,因为我之前是在很久之前就安装了,所以现在在安装infer的时候会出现部分所需插件版本过低的情况。然后我想升级插件,也需要先更新brew,但我的brew更新也是失败:Error: /usr/local must be writable! 错误

    这种情况下,还想是使用Brew进行安装的话,需要如下操作:
    1.卸载旧的brew
    ```
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)”

    ```
    2.安装新的brew
    ```
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    ```
    之后,再按照infer的安装提示一步步安装。
    2019-03-28
    1
  • Geek
    传统编译器的工作原理,基本上都是三段式的,可以分为前端、优化器和后端。前端负责解析源代码,检查语法错误,并将其翻译为抽象的语法树;优化器对这一中间代码进行优化,试图使代码更高效;后端则负责将优化器优化后的中间代码转换为目标机器的代码,这一过程后端会最大化的利用目标机器的特殊指令,以提高代码的性能。基于这个认知,我们可以认为 LLVM 包括了两个概念:一个广义的 LLVM 和一个狭义的 LLVM 。广义的 LLVM 指的是一个完整的 LLVM 编译器框架系统,包括了前端、优化器、后端、众多的库函数以及很多的模块;而狭义的 LLVM 则是聚焦于编译器后端功能的一系列模块和库,包括代码优化、代码生成、JIT 等。
    ---------------------
    作者:艾蔓草
    来源:CSDN
    原文:https://blog.csdn.net/xhhjin/article/details/81164076
    版权声明:本文为博主原创文章,转载请附上博文链接!
    2019-03-28
    1
  • Geek_1ce2e0
    Swiftlint就行
    2019-03-26
    1
  • Nevermore
    SwiftLint
    2019-03-26
    1
  • 疯狂的石头
    遇见这个问题的童鞋
    Error: the following clang command did not run successfully:
        /usr/local/Cellar/infer/0.15.0/lib/infer/facebook-clang-plugins/clang/install/bin/clang
    去/Library/Developer/CommandLineTools/Packages这个目录,安装pkg可以解决
    2019-07-07
  • 烈人
    使用homebrew安装infer后,直接infer -- clang xx.m ,报头文件找不到。我也是无语。xcode10。然后扫描整个工程又是正常的。
    2019-05-29
  • GODV
    Error while trying to load a compilation database:
    Could not auto-detect compilation database for file "Hello.m"
    No compilation database found in /Users/***/Desktop/OCLintTest or any parent directory
    用OCLint创建应该放在那个目录下,不太明白
    2019-05-27
  • Geek_ccbbef
    老师,-bash: scan-build: command not found 是什么原因呢,资源也下了,为什么会报这样的错误呢
    2019-04-25
  • 快到碗里来
    infer扫描iOS单个文件报错 怎么回事啊
    2019-04-19
  • 青冈
    不知道有人知道infer 怎么配置黑名单来过滤不想扫描的文件,如pod引入的AFN等三方库?
    2019-04-08
收起评论
35
返回
顶部