用OCLint给iOS代码做静态分析
来源:互联网 发布:山东省移动公司网络部 编辑:程序博客网 时间:2024/04/29 19:31
用OCLint给iOS代码做静态分析
可以对iOS代码做代码静态分析的工具有OCLint
, 这篇帖子说的就是如何使用这个工具. 转载请注明出处,晓月的博客:(http://blog.csdn.net/uxyheaven/article/details/50818107)
什么是OCLint
最好的介绍当然首选官方文档, 以下的说明摘选自官方文档:
OCLint是一个代码静态分析描工具, 可以用来提高质量和减少缺陷, 他目前支持C, C++, Objective-C语言, 他目前可以发现这些问题:
- 可能的bug - 空的 if / else / try / catch / finally 语句
- 未使用的代码 - 未使用的局部变量和参数
- 复杂的代码 - 高圈复杂度, NPath复杂, 高NCSS
- 冗余代码 - 多余的if语句和无用的括号
- 坏味道的代码 - 过长的方法和过长的参数列表
- 不好的使用 - 倒逻辑和入参重新赋值
安装
<code class="hljs cmake has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">brew <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">install</span> xctoolbrew <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">install</span> Caskroom/cask/oclint</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
如果安装不了请翻墙.
使用
先编译一遍工程, 然后执行脚本就可以生成报告了. 如果不存在bash_profile
文件, 需要自己生成一个, 进到那个目录后touch .bash_profile
.
笔者先抛砖引玉的给出一个自定义了部分扫描规则的脚本.
<code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># import path</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">export</span> PATH=<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">${PATH}</span>:/usr/local/bin<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># import what we have in bash_profile</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">source</span> ~/.bash_profile<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># oclint</span>workspaceExt=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">".xcworkspace"</span>tempPath=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>project_path=$(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">pwd</span>)project_name=$(ls | grep xcodeproj | awk -F.xcodeproj <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'{print $1}'</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 更新第三方库</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> [ <span class="hljs-operator" style="box-sizing: border-box;">-f</span> Podfile ]; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">then</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">echo</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"==========pod update========="</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#pod update</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">fi</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># find .xcworkspace</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> workspacePath <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> `find <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">${project_path}</span> -name <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$project_name</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$workspaceExt</span>"</span> -print`<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">do</span>tempPath=<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">${workspacePath}</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">done</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">echo</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"===========oclint=========="</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> [ <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$tempPath</span>"</span> == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span> ];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">then</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># oclint clean</span>xctool -project <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">${project_name}</span>.xcodeproj \-scheme <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">${project_name}</span> \-reporter json-compilation-database:compile_commands.json \clean<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">echo</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"===========oclint=project=clean=done========="</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># build</span>xctool -project <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">${project_name}</span>.xcodeproj \-scheme <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">${project_name}</span> \-reporter json-compilation-database:compile_commands.json \build<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">echo</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"===========oclint=project=build=done========="</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># oclint clean</span>xctool -workspace <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">${project_name}</span>.xcworkspace \-scheme <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">${project_name}</span> \-reporter json-compilation-database:compile_commands.json \clean<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">echo</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"===========oclint=workspace=clean=done========="</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># build</span>xctool -workspace <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">${project_name}</span>.xcworkspace \-scheme <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">${project_name}</span> \-reporter json-compilation-database:compile_commands.json \build<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">echo</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"===========oclint=workspace=build=done========="</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">fi</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 生成报表</span>oclint-json-compilation-database -v \<span class="hljs-operator" style="box-sizing: border-box;">-e</span> Pods \oclint_args -- -report-type html -o oclintReport.html \-disable-rule ObjCAssignIvarOutsideAccessors \-rc=MINIMUM_CASES_IN_SWITCH=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> \-rc=LONG_VARIABLE_NAME=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span> \-disable-rule ShortVariableName \-rc=CYCLOMATIC_COMPLEXITY=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span> \-rc=LONG_CLASS=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">700</span> \-rc=LONG_LINE=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">200</span> \-rc=LONG_METHOD=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">80</span> \-rc=NCSS_METHOD=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">40</span> \-rc=NESTED_BLOCK_DEPTH=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span> \-rc=TOO_MANY_FIELDS=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span> \-rc=TOO_MANY_METHODS=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">30</span> \-rc=TOO_MANY_PARAMETERS=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 删除 compile_commands.json 可能会很大</span>jsonPath=<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$project_path</span>/<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"compile_commands.json"</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#echo ${jsonPath}</span>rm <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$jsonPath</span>open oclintReport.html<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exit</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li></ul>
有些文件是不想去做静态分析的, 如一些第三方库, 我们可以这样设置它, 去忽略文件夹:
<code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-operator" style="box-sizing: border-box;">-e</span> Pods</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
OCLint是有一套默认的规则的. 你可以对这些默认的扫描规则做出修改, 如忽略一些规则或者改变某些规则的阈值, 这里是笔者自定义的一些扫描规则:
<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 扫描规则</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># http://docs.oclint.org/en/stable/rules/index.html</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># -- 共约</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 忽略 if折叠</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-disable-rule CollapsibleIfStatements \</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 忽略 直接使用变量</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-disable-rule ObjCAssignIvarOutsideAccessors \</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># switch case 最少数量</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-rc=MINIMUM_CASES_IN_SWITCH=3 \</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># --命名</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 变量名字最长字节</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-rc=LONG_VARIABLE_NAME=20 \</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 变量名字最短字节</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-disable-rule ShortVariableName \</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># --size</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 圈复杂度</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-re=CYCLOMATIC_COMPLEXITY=10 \</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 每个类最行数</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-rc=LONG_CLASS=700 \</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 每行字节数量</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-rc=LONG_LINE=200 \</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 每个方法行数</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-rc=LONG_METHOD=80 \</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 忽略注释后括号后的有效代码行数</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-rc=NCSS_METHOD=40 \</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 嵌套深度</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-rc=NESTED_BLOCK_DEPTH=5 \</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 字段数量</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-rc=TOO_MANY_FIELDS=20 \</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 方法数量</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-rc=TOO_MANY_METHODS=30 \</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 方法参数</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#-rc=TOO_MANY_PARAMETERS=6</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li></ul>
扫描报告解读
脚本最终会生成一个oclintReport.html
页面去陈述扫描结果. 介绍了总共涉及多少文件, 其中有多少文件违反了规则, 各种优先级的规则违反了多少等等.
接下来就是详细的规则违反情况了:
- File - 违反规则的文件
- Location - 违反规则的代码位置
- Rule Name - 违反的规则名称
- Rule Category - 违反的规则类别
- Priority - 违反的规则优先级
- Message - 违反的规则描述
解读这些违反的规则就是进代码去看, 一般看到代码也就知道是什么原因了. 如果看了代码还是不理解, 可以去参考下官方的文档:http://docs.oclint.org/en/stable/rules/index.html
. 文档对每个规则还列出了demo.如
- empty else block // 空else
<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> example(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> a){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> a + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// empty else statement, can be safely removed</span> { }}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>
后记
最后就是配置下Jenkins, 让每次编译的同时, 都给出一个报告来.
0 0
- 用OCLint给iOS代码做静态分析
- 用OCLint给iOS代码做静态分析
- 用OCLint给iOS代码做静态分析
- 静态代码扫描--OCLint
- 【指导】iOS代码静态检查 -- oclint (+ xcodebuild + xcpretty + jenkins)
- iOS项目的静态代码扫描之OClint安装
- iOS项目的静态代码扫描之OClint使用
- 使用OClint进行iOS项目的静态代码扫描
- OCLint:静态代码分析工具(C、C++和Objective-C)
- [OCLint]OCLint代码检查规则
- 在xcode中使用OCLint做代码审查
- [OCLint]iOS项目中使用OCLint指导手册
- Clang &IOS 静态代码分析工具scan-build
- iOS静态代码分析时常见错误及解决办法
- [Linux]用Clang实现代码静态分析
- 关于静态代码分析
- 关于静态代码分析
- FxCop静态代码分析
- getline(char*,int,' ')用法
- 求最大公约数(c++)
- 移动统计工具Flurry
- 练习二1014
- android 控件 fragment 简单分析
- 用OCLint给iOS代码做静态分析
- 第三章 Managing Mem With Arc 笔记
- C++线程 基础教程
- VideoView播放视频
- 一个点击 图片选中,改变图片样式, 传数据到后台的一个例子
- 看看数据科学家们都在用什么:Github上的十大深度学习项目
- 【论文笔记】(CVPR2016 Oral) Training Region-based Object Detectors with Online Hard Example Mining
- C语言中的隐式转换
- iOS非CocoPods集成七牛播放SDK PLPlayerKit 使用指南