【问题标题】:How to get Xcode to generate warning (or error) on Mismatched Return Type?如何让 Xcode 在不匹配的返回类型上生成警告(或错误)?
【发布时间】:2023-04-01 15:14:01
【问题描述】:

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

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

这是我的代码:

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

文档表明不匹配的返回类型与 GCC_WARN_ABOUT_RETURN_TYPE 相关联,但尚不清楚这会强制执行哪些规则。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    问题在于false 实际上是0#define。您可以在 stdbool.h 中找到定义,在 Xcode 8.3.3 中隐藏在此路径中:

    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/8.1.0/include/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 开始,您可以打开“Implicit Non-Literal Null Conversions”构建设置,而不是修改“Other C Flags”。

    【讨论】:

    • 天哪!当您需要时,技术在哪里?我现在必须追捕所有这些不匹配的实例。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2022-10-04
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多