繁体   English   中英

GCC vs Clang:“-pedantic-errors”的含义

[英]GCC vs Clang: Meaning of "-pedantic-errors"

我在 Windows 10 上使用 Clang v3.7.0 和Mingw-w64 5.1.0 和 GCC 5.1.0,全部是 64 位。我的目标是使用一组 Clang 和 GCC 选项,这会给我最好的机会检测跨许多不同编译器的潜在C89C++98语言标准可移植性问题。 例如,对于 CI 已经使用以下 GCC 命令行并取得了相当不错的成功:

gcc -c -x c -std=c89 -pedantic-errors -Wall -Wextra -Wno-comment -Wno-parentheses -Wno-format-zero-length test.c

但是,我最近用 Clang 尝试了它并得到了不同的结果。 这是我的示例测试代码:

int main(void)
{
    int length = (int)strlen("Hello");
    return 0;
}

使用 Clang 我收到以下错误,而使用 GCC 我得到相同的基本信息,但它将其标记为警告:

test.c:3:22: error: implicitly declaring library function 'strlen'
with type 'unsigned long long (const char *)'
    int length = (int)strlen("Hello");

如果我删除-pedantic-errors选项,或者只是将其更改为-pedantic ,那么 Clang 只会将其标记为警告,这正是我真正想要的。 但是,根据 GCC 文档, -pedantic-errors选项会导致被视为语言扩展的警告被标记为错误,但不使用原型的函数不是 C89 中的扩展。 所以,我有三个基本问题:

  1. Clang 是否改变了 GCC 使用的-pedantic-errors的含义,或者我误解了什么?

  2. 强制遵守所选标准并为所有不符合规范的代码发出错误的最佳选项集是什么?

  3. 如果我继续将-pedantic-errors与 Clang 一起使用,有没有办法让它在特定情况下发出警告而不是错误? 在本网站的另一篇文章中,给出了一个答案,说使用以下内容,其中 foo 是错误:

     -Wno-error=foo

如果这是一种正确的方法,那么我实际上使用什么来代替foo来解决像我得到的错误,因为没有指示实际的错误号? 我不敢相信它实际上想要以下所有内容:

-Wno-error=implicitly declaring library function 'strlen'
with type 'unsigned long long (const char *)'

您的代码无效,行为未定义,因此编译器在编译. 隐式声明的int strlen(char*)size_t strlen(const char *)不兼容。

Clang 是否改变了 GCC 使用的 -pedantic-errors 的含义,还是我误解了什么?

当我阅读它时,是的。 从 clang 文档:

-pedantic-errors

    Error on language extensions.

在 gcc 中:

-pedantic

    Issue all the warnings demanded by strict ISO C and ISO C++ [...]

-pedantic-errors

    Give an error whenever the base standard (see -Wpedantic) requires a diagnostic, in some cases where there is undefined behavior at compile-time and in some other cases that do not prevent compilation of programs that are valid according to the standard.

扩展上的 Clang 错误。

当标准明确要求时以及在其他“某些情况下”时,GCC 会出错。

这是一个不同的,它是一组不同的错误。 标准可能不需要诊断,但它仍然是一个扩展 - GCC 将保持沉默,Clang 将出错。

强制遵守所选标准并为所有不符合规范的代码发出错误的最佳选项集是什么?

想到的第一个答案是:“没有”。 编译器固有地使用“实现定义的行为”和扩展,因为它们首先要编译代码,而不是不编译不符合规范的代码。 有些情况下代码是一致的,但编译器之间的行为仍然不同 - 您可以在此处探索这种情况

无论如何,请继续使用-pedantic-errors ,因为它似乎可以用于检测不合格的代码。 您的代码无效,行为未定义,因此您的代码不符合标准,因此 clang 正确检测到它。 还可以使用 linters 和 sanitizers 来检测其他未定义行为的情况。

如果我继续将 -pedantic-errors 与 Clang 一起使用,有没有办法让它在特定情况下发出警告而不是错误?

使用-fno-builtin

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM