1

メソッドの戻り値の型の型のコードを変更したばかりで、コンパイラが警告を表示していて、不一致が検出された場合はどこでも見つけて修正できます。しかし、警告はありません。私の設定では、すべてのビルドタイプで「不一致の戻り値の型」がすでに「はい」であることが判明したので、「はい(エラーとして扱う)」に変更して再構築しました。ビルド結果にまだ何も表示されません。不一致の戻り値の型に対して警告(またはエラー)を生成するXcodeを取得するにはどうすればよいですか?

「警告をエラーとして扱う」を「はい」に変更したところ、いくつかの有用なエラーメッセージが表示されましたが、不一致の警告は表示されませんでした。おそらく私はコンパイラとObjective-Cの戻り値の型について何かを理解していないかもしれませんが、boolはNSNumber *を返さなければならないと指定しても受け入れられないはずです。

は、ここに私のコードです:

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

ドキュメントが不一致の戻り値の型がGCC_WARN_ABOUT_RETURN_TYPEに関連付けられていることを示唆しているが、これは強制ルール何それは明らかではありません。

自分のビルド設定の警告セクションの下の図では、関連する設定に注目しています。私は "警告としてエラーを処理する"と "不一致の戻り型"をすべてのビルドで有効にしています。

enter image description here

Xcodeのは、私はメソッド定義と呼び出し元のコードとの間の契約のこの種を違反していたときに私が知っているように取得する方法はありますか?

答えて

4

悲しいニュース...ここでの問題は、「ミスマッチリターンタイプ」の警告/エラー設定ではありません。

falseは、0の場合、実際には#defineです。 Xcode 8.3.3でこのパスに隠されているstdbool.hの定義を見つけることができます。

/アプリケーション/ Xcode.app /コンテンツ/開発者/ツールチェーン/ XcodeDefault.xctoolchain /usr/lib/clang/8.1.0/ include/stdbool.h

プリプロセッサ定義なので、コンパイラの意味解析部が見る前にfalseから0に変更されます。

Cでは、ヌルポインタとして裸のリテラル0を使用できます。あなたのケースでは、falseNSNumberへのヌルポインタとして扱われ、正当な戻り値です。

Objective-Cブール値NOを使用しても、それだけでは問題は解決されません。 NO__objc_noため#defineである(/usr/include/objc/objc.hを参照)、a clang extension that effectively acts as a literal 0である(ただし、コンパイラが適切なシングルトンに@YES@NOを変換するために使用可能にする)があります。

が警告を取得するには、次の3つの手順を実行する必要があります。

  1. があなたの「その他のCフラグ」ビルド設定に-Wnon-literal-null-conversionを追加します。
  2. falseの代わりにNOを返します。
  3. _Nonnullを返す関数を宣言してください。

結果:Xcodeの9以降

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

、あなたは設定の代わりに、「その他のCフラグを」変更建てる「暗黙的な非リテラルNullの変換」をオンにすることができます。

+0

私はちょうど同じ基本情報を投稿する準備ができました。 – rmaddy

+0

そうです。必要な時に技術はどこにありますか?私はこれらのミスマッチのすべてのインスタンスを今すぐ削除する必要があります。ありがとう。 – Alyoshak

関連する問題