1

我只是在方法的返回類型的類型中進行了代碼更改,並且指望編譯器顯示警告,以便在現在發生不匹配的地方找到並修復這些警告。但沒有警告。在我的設置中,我發現對於所有構建類型,「不匹配返回類型」已經爲「是」,所以我決定將其更改爲「是(視爲錯誤)」並進行了重建。在構建結果中仍然沒有跡象。如何讓Xcode在不匹配的返回類型上生成警告(或錯誤)?

然後,我將「將警告視爲錯誤」更改爲「是」,併產生了一些有用的錯誤消息,但沒有不匹配的警告。也許我不明白關於編譯器和Objective-C返回類型的一些東西,但是當我的方法指定應該返回一個NSNumber *時,似乎bool不應該被接受。

這裏是我的代碼:

+(NSNumber*) compilerCompletelyFineWithThis 
{ 
    if ([m_session tryThis]) 
    { 
     return [m_session goGetSumthin]; 
    } 
    else 
     return false; 
} 

該文檔顯示,不匹配的返回類型與GCC_WARN_ABOUT_RETURN_TYPE相關,但什麼規則,該強制執行,目前尚不清楚。

在我的Build Settings的警告部分下面的圖片中,注意相關設置。對於我的所有版本,我都已打開「將警告視爲錯誤」和「不匹配返回類型」。

enter image description here

有沒有辦法讓Xcode的,讓當我違反這種方法定義和調用代碼之間的合同我知道嗎?

回答

4

傷心的消息......這裏的問題與「不匹配的返回類型」警告/錯誤設置不匹配。

的問題是,false實際上是一個#define0。您可以在stdbool.h中找到隱藏在Xcode 8.3.3中此路徑的定義:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/8.1.0/包括/ stdbool.h

因爲它是一個預處理器定義,它就會從false編譯器的語義分析的部分看到它之前改變0

在C中,您可以使用裸立即數0作爲空指針。所以在你的情況下,false被視爲空指針NSNumber並且是一個合法的返回值。

即使您使用首選的Objective-C布爾NO,那也不能解決問題。 NO#define__objc_no(參見/usr/include/objc/objc.h),它是a clang extension that effectively acts as a literal 0(但它允許編譯器使用將@YES@NO轉換爲合適的單元)。

爲了得到一個警告,你需要採取三個步驟:

  1. 添加-Wnon-literal-null-conversion到你的「其他C標誌」構建設置。
  2. 返回NO而不是false
  3. 聲明你的函數返回_Nonnull

結果:

+(NSNumber * _Nonnull) compilerCompletelyFineWithThis { 
    return NO; 
    // error: Expression which evaluates to zero treated as a null pointer constant of type 'NSNumber * _Nonnull' 
} 

開始在Xcode 9,你可以打開「隱非字面空的轉換」建設置而不是修改「其他C標誌」。

+0

我剛準備發佈相同的基本信息。 – rmaddy

+0

嘖嘖嘖嘖。當你需要它時,技術在哪裏?我必須現在搜尋所有這些不匹配的情況。謝謝。 – Alyoshak

相關問題