簡體   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