OCLint
是用來做c,c++和Objective-c的靜態(tài)代碼分析工具梳凛。在OCLint安裝和使用中介紹了OCLint
的安裝和是使用别惦。運(yùn)行OCLint
之后潭枣,要根據(jù)規(guī)則讀懂結(jié)果,分析和修改代碼绞蹦。
有的時(shí)候代碼出現(xiàn)的一些警告拳恋,并不需要立刻修改氮发,但是有一個(gè)警告在哪里看著還是挺別扭的渴肉,這個(gè)時(shí)候會(huì)就需要了解如何禁止或者忽略一些規(guī)則,來消除警告爽冕。
OCLint規(guī)則
最新的OCLint中有67個(gè)檢查的規(guī)則
http://docs.oclint.org/en/stable/rules/index.html仇祭,
主要對(duì)針對(duì)nil值的檢查,cocoa的obj檢查颈畸,類型轉(zhuǎn)換乌奇,空值的檢查,簡潔語法的檢查眯娱,參數(shù)礁苗,size和不使用的參數(shù)和變量的檢查。
主要分為9大類:
Basic
Cocoa
Convention
Empty
Migration
Naming
Redundant
Size
Unused
之前介紹的的我們可以使用命令:oclint-json-compilation-database
的-e 參數(shù)忽略指定的文件徙缴,比如忽略Pods文件夾下面的檢查:
oclint-json-compilation-database -e Pods -- -o=report.html
還可以還用 -rc 改變檢查規(guī)則的默認(rèn)值:
oclint-json-compilation-database -- -rc=LONG_LINE=200 -o=report.html
如果想禁止某一個(gè)規(guī)則的使用可以使用命令-disable-rule
:
oclint-json-compilation-database -disable-rule=LongLine
這樣就可以禁止Size
中對(duì)LongLine
的檢查试伙。
OCLint結(jié)果分析
OCLint的靜態(tài)分析結(jié)果,警告的級(jí)別是從P1,P2,P3依次降低的于样,可以根據(jù)生成的報(bào)告找到對(duì)應(yīng)的規(guī)則疏叨,以及修改建議。
比如下面是一條生成的警告信息:
..../.../SuperLoggerPreviewView.m:165:5: bitwise operator in conditional [basic|P2]
..../.../SuperLoggerPreviewView.m:165:5
:的意思是產(chǎn)生警告的文件以及對(duì)應(yīng)的行號(hào)穿剖。
bitwise operator in conditional
:描述信息蚤蔓。
[basic|P2]
這個(gè)信息中basic是指檢查規(guī)則的類型,對(duì)應(yīng)檢查規(guī)則的9大類別,P2
是警告的級(jí)別
可以在Rule Index 的第一個(gè)分類Basic
中可以找到bitwiseoperatorinconditional
,就是需要了解的規(guī)則信息:
禁止OCLint的檢查
有的時(shí)候在已知的情況下一段代碼會(huì)產(chǎn)生OCLint的警告携御,但是因?yàn)槠渌囊恍┰虿粒覀冇植荒苄薷拇a,或者還沒有找到更好的修改方式的時(shí)候啄刹,可以在代碼中禁止OCLint的檢查涮坐。
1.注解
可以使用注解的方法禁止OCLint的檢查,語法是:
attribute((annotate("oclint:suppress[unused method parameter]")))
比如我們知道一個(gè)參數(shù)沒有使用,而又不想產(chǎn)生警告信息就可以這樣寫:
- (IBAction)turnoverValueChanged:
(id) __attribute__((annotate("oclint:suppress[unused method parameter]"))) sender
{
int i; // won't suppress this one
[self calculateTurnover];
}
對(duì)于方法的注解可以這樣寫:
bool __attribute__((annotate("oclint:suppress"))) aMethod(int aParameter)
{
// warnings within this method are suppressed at all
// like unused aParameter variable and empty if statement
if (1) {}
return true;
}
2.!OCLint
也可以通過//!OCLint
注釋的方式誓军,不讓OCLint檢查袱讹。
比如:
void a() {
int unusedLocalVariable; //!OCLINT
}
注釋要寫在對(duì)應(yīng)的行上面才能禁止對(duì)應(yīng)的檢查,比如對(duì)于空的if/else禁止檢查的注釋為:
if (true) //!OCLint
{
// it is empty
}