LLVM在警告方麵的改進 @ WWDC 2013
在上一篇文章中討論了LLVM對注釋進行了處理,在這個處理過程中,LLVM可以對注釋的不合理性給出警告:
在寫注釋的過程中,可能產生以下幾點不合理的地方:
1. 描述為空,包括函數說明或者參數說明。如下圖:
2. 返回類型不匹配。如下圖:
3. 參數名稱不一致。如下圖:
4. 參數名不一致,還有可能是由於拚寫錯誤,對於這種場景有自動修正功能:
除了上述針對注釋的警告外,LLVM在警告方麵還做了另外一些改進:新增一些編譯警告;默認開啟更多的警告(比如上述文檔注釋警告默認不開啟);嚴重警告升級為錯誤。
1. 針對一些語言標準未定義的(可移植性存在問題),或者是編譯器實現有差異的代碼給出警告(默認開啟):
2. 整型數據計算溢出(默認開啟),見下圖:
從上圖可以看出整型計算溢出的警告還停留在比較初級的階段,比如r的結果由m和n相乘得出但沒有警告——如果這裏要給警告要怎麼做?
3. 未使用的函數(經驗證,針對的是未使用的靜態函數):
第一眼看到“Unused Functions”的標題時,我內心是喜悅的,遺憾的是目前發現隻應用在靜態函數上。不過想想也是,其它函數或者接口實現有可能在其它地方被調用,而掃描整個項目源碼來確定每個函數是否被調用過顯然是不值得的。
4. 隱式的布爾值轉換。這點比較適用於C++代碼,但我一時還比較體會不了具體的實用場景,就摘錄一段WWDC 2013 Session 402的片段(如果有誰對這個特性比較有感覺,請指點下):
5. 隱式枚舉類型轉換。這點也挺讚的,不同的枚舉定義就是不同的數據類型範疇了,在不同數據類型之間轉換是應該給點警告:
6. 針對未聲明的selector進行警告:
之前我曾經遇到過一個問題,就是想調用未聲明接口的方法實現但又不產生警告,嚐試用編譯器指示符消除:
示例代碼: #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-variable" int i; #pragma GCC diagnostic pop 不過下麵怎麼也消除不了: #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wall" [self.superview cellDidClick:self]; #pragma GCC diagnostic pop 隻能: [self.superview performSelector:@selector(cellDidClick:) withObject:self];
現在。。。LLVM又加強了這方麵的檢查。。。
7. 返回值類型不一致的話,直接作為錯誤:
8. 定義基類需要顯式聲明,否則作為錯誤處理:
如果要定義基類,需要在接口定義前專門聲明:
—— Jason Lee @ Hangzhou
最後更新:2017-04-03 16:48:46