簡體   English   中英

當將求值為0的整數枚舉用作指針時,gcc是否應發出警告?

[英]Should gcc warn when an integral enum that evaluates to 0 is used as a pointer?

下面的程序在沒有警告的情況下進行編譯(這是不希望的,因為在第19和21行上省略數組索引會有效地破壞數組)。 如果使用-D CHECK_NONZERO進行編譯,則將看到第23行將在沒有警告的情況下進行編譯,因為枚舉BBB的值為1,而AAA和aaa的值為0。

看來,如果枚舉的值為0,gcc會將其無縫轉換為NULL指針。

應該將其視為錯誤嗎?

編輯:我認為我對自己認為的問題不像以前那么清楚。 在我看來,在將枚舉解析為其常數之前,出於警告目的對枚舉進行類型檢查不會有任何危害,但這不是gcc目前的工作方式。 但是,我不確定這是否值得向gcc項目提交錯誤報告或功能請求。

#include <stdio.h>
#include <stdlib.h>

typedef enum {
    AAA,
    BBB,
} alpha_e;

enum {
    aaa,
    bbb,
};

int main(void) {
    alpha_e *alpha_array = malloc(sizeof(*alpha_array) * 2);
    alpha_array[0] = AAA;
    alpha_array[1] = BBB;
    printf("1: alpha_array[0] == %u, alpha_array[1] == %u\n", alpha_array[0], alpha_array[1]);
    alpha_array = AAA;
    printf("2: alpha_array[0] == %u, alpha_array[1] == %u\n", alpha_array[0], alpha_array[1]);
    alpha_array = aaa;
#ifdef CHECK_NONZERO
    alpha_array = BBB;
#endif
    return 1;
}

gcc -v:

Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5.1' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)

任何取值為0的整數常量表達式都應被視為空指針。 我認為枚舉值被認為是常量-它不是可以更改的值。

將指針設置為任何其他整數值是不合法的。

整數文字0是一個空指針常量。

(C99,6.3.2.3p3指針):“值為0的整數常量表達式,或此類強制轉換為void *類型的表達式,稱為空指針常量。”

int *p = 0;   // p is a null pointer

(C99,6.3.2.3p3)“如果將空指針常量轉換為指針類型,則保證生成的指針(稱為空指針)將不相等的值與指向任何對象或函數的指針進行比較。”

6.3.2.3指針
...
. 3值為0的整數常量表達式,或強制類型為void *的表達式,稱為 , is guaranteed to compare unequal to a pointer to any object or function. 66)如果將空指針常量轉換為指針類型,則保證生成的指針(稱為將不相等的值與指向任何對象或函數的指針進行比較。

4將空指針轉換為另一種指針類型將產生該類型的空指針。 任何兩個空指針應比較相等。

5整數可以轉換為任何指針類型。 除非先前指定,否則結果是實現定義的,可能未正確對齊,可能未指向引用類型的實體,並且可能是陷阱表示。 67)
...

66)宏NULL在<stddef.h>(和其他頭文件)中定義為空指針常量; 見7.19。

67)用於將指針轉換為整數或將整數轉換為指針的映射函數旨在與執行環境的尋址結構一致。

因此,不是錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM