12

我最近遇到一个案例,有人在 init 方法中添加了一个参数,并破坏了另一个共享代码的项目。由于这只是一个警告,没有人意识到该应用程序已损坏,因此我试图仅将此警告变为错误:

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

我发现您可以将 Other C Flags 中的 -Werror=foo 传递给 Xcode 中的编译器,以将警告转换为错误,但我似乎找不到 'foo' 应该是什么。我已经尝试过“未声明的选择器”,但这只捕获了@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 回答