12

最近、誰かが init メソッドにパラメーターを追加し、コードを共有する別のプロジェクトを壊したというケースがありました。これは単なる警告であるため、アプリが壊れていることに誰も気付かなかったので、この警告のみをエラーに変えようとしています。

warning: instance method '-someMethod' not found (return type defaults to 'id')

-Werror=foo in Other C Flags を Xcode のコンパイラに渡して、警告をエラーに変えることができることを発見しましたが、「foo」が何であるべきかを見つけることができないようです。「undeclared-selectors」を試しましたが、@selector のケースしかキャッチしません。-Werror-implicit-function-declaration を試しましたが、それもそのケースをキャッチしていないようです。

巨大なclangソースコードを何気なく検索しているときに「warn_inst_method_not_found」を見つけた後、「inst-method-not-found」と「instance-method-not-found」を試しました。

ヘルプ ... ?

更新: 警告を表示するために (CodeRunner などで) コンパイルできる例を次に示します: https://gist.github.com/4045701

4

1 に答える 1

11

お探しのオプションは-Werror=objc-method-access. 投稿した要点をダウンロードしてコンパイルすると、Clang は警告メッセージでこの権利を明示的に通知します。

% clang test.m -c
test.m:13:21: warning: instance method '-initWithNum:' not found (return type
      defaults to 'id') [-Wobjc-method-access]
  ...theObj = [[MyClass alloc] initWithNum: [NSNumber numberWithInt: 15]];
              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.

% clang test.m -Werror=objc-method-access -c  // ta-da!

しかし、実際の状況では、上記のすべてのコメント投稿者に同意します。すべてのコンパイラ警告を修正または抑制すべきです。ビルドは常にクリーンにビルドする必要があります。そうしないと、あなたが正しく観察したように、実際のバグと「通常のスパム」を区別することができなくなります。

FWIW、これが私が使用しているClangのバージョンです:

$ clang --version
clang version 3.2  (http://llvm.org/git/llvm 1503aba4a036f5394c7983417bc1e64613b2fc77)
Target: x86_64-apple-darwin12.2.0
Thread model: posix
于 2012-11-16T23:21:19.220 に答える