如何让Xcode在不匹配的返回类型上生成警告(或错误)?

时间:2017-06-22 21:14:44

标签: objective-c xcode compiler-errors compiler-warnings type-mismatch

我刚刚对方法返回类型的类型进行了代码更改,并指望编译器显示警告,这些警告可以让我找到并修复现在不匹配的地方。但没有警告。在我的设置中,我发现"不匹配的返回类型"已经"是"对于所有构建类型,所以我决定将其更改为"是(视为错误)"并做了重建。在构建结果中仍然没有任何迹象。

然后我改变了#34;将警告视为错误"到"是"这产生了一些有用的错误消息,但没有不匹配的警告。也许我对编译器和Objective-C返回类型一无所知,但是当我的方法指定应返回NSNumber *时,似乎不应该接受bool。

这是我的代码:

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

文档建议不匹配的返回类型与GCC_WARN_ABOUT_RETURN_TYPE相关联,但不清楚它强制执行哪些规则。

在我的构建设置的警告部分下面的图片中,请注意相关设置。我有"将警告视为错误"和"不匹配的退货类型"为我的所有构建打开了。

enter image description here

当我违反方法定义和调用代码之间的这种契约时,有没有办法让Xcode告诉我?

1 个答案:

答案 0 :(得分:5)

悲伤的消息......这里的问题不在于“不匹配的返回类型”警告/错误设置。

问题是false实际上是#define的{​​{1}}。您可以在0中找到隐藏在Xcode 8.3.3中此路径的定义:

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

由于它是预处理器定义,因此在编译器的语义分析部分看到之前,它会从stdbool.h更改为false

在C中,您可以使用裸文字0作为空指针。因此,在您的情况下,0被视为指向false的空指针,并且是合法的返回值。

即使您使用首选的Objective-C布尔值NSNumber,也不会解决问题。 NONO的{​​{1}}(请参阅#define),a clang extension that effectively acts as a literal 0(但允许编译器用于转换__objc_no和{ {1}}适当的单身人士)。

要获得警告,您需要采取三个步骤:

  1. /usr/include/objc/objc.h添加到“其他C标志”构建设置。
  2. 返回@YES而不是@NO
  3. 声明您的函数以返回-Wnon-literal-null-conversion
  4. 结果:

    NO

    从Xcode 9开始,您可以启用“隐式非文字空转换”构建设置,而不是修改“其他C标志”。