閱讀982 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go linux 之 snprintf函數用法
  下一篇:go FFMPEG在windows平台編譯的詳細過程,包括環境安裝