2015-12-23 2 views
6

पर विचार करें:प्रकार जीसीसी 5 में खुद के साथ असंगत जब -Wwrite-तार का उपयोग कर

char f(const char (*x)[4]); 

void foo(void) { 
    typeof(*"FOO") x[4]; 
    f(&x); 
} 

-Wwrite-strings साथ संकलित:

gcc-5 -c gcc5.c -Wwrite-strings 

आप मिल:

gcc5.c: In function ‘foo’: 
gcc5.c:5:7: warning: passing argument 1 of ‘f’ from incompatible pointer type [-Wincompatible-pointer-types] 
    f(&x); 
    ^
gcc5.c:1:6: note: expected ‘const char (*)[4]’ 
    but argument is of type ‘const char (*)[4]’ 
char f(const char (*x)[4]); 
    ^

एक बग की तरह लग रहा जीसीसी में, जब तक कि मुझे कुछ याद नहीं आ रहा है?

नोट: -Wwrite-strings शाब्दिक तार के प्रकार के परिवर्तन:

जब सी संकलन, स्ट्रिंग देना प्रकार स्थिरांक "स्थिरांक चार [लंबाई]"

+1

सी में, '*" FOO "का प्रकार' char' है। क्या '-व्राइट-स्ट्रिंग्स' को बदलना है (संकलक गैर मानक बनाते हैं)?यदि ऐसा नहीं है, तो बग '& x' के प्रकार को 'const char (*) [4]' के रूप में प्रदर्शित कर रहा है: कोई' const' नहीं है। –

+1

एक बग की तरह लगता है। एक बग रिपोर्ट दर्ज करने पर विचार करें। – fuz

+1

@ पास्कल क्यूओक: यहां तक ​​कि, एक 'char (*) [4] 'एक' const char (*) [4] 'सही में परिवर्तनीय है? यह एक "असंगत सूचक प्रकार" क्यों होगा? –

उत्तर

1

मेरे लिए यह वास्तव में gcc में एक बग है 5

gccdocumentation कहते

-Wwrite-तार

जब संकलन सी, स्ट्रिंग देना प्रकार स्थिरांक चार [लंबाई] स्थिरांक ताकि एक गैर स्थिरांक चार * सूचक में एक के पते को कॉपी एक चेतावनी पैदा करता है।

तो इस घोषणा के साथ

:

typeof(*"FOO") x[4]; 

तो &x प्रकार const char (*)[4] की है जब -Wwrite-strings मौजूद है। मानक सी में, char (*)[4] प्रकार का है।

यह छोटा सा समारोह:

void foo(void) { 
    typeof(*"FOO") x[4]; 
    printf("%d\n", __builtin_types_compatible_p(typeof(&x), const char (*)[4])); 
    printf("%d\n", __builtin_types_compatible_p(typeof(&x), char (*)[4])); 
} 

प्रिंट:

1 
0 

gcc5.3 और -Wwrite-strings साथ। तो हम देख सकते हैं कि gcc5.3const char (*)[4] के प्रकार -Wwrite-strings के साथ सही ढंग से &x की पहचान करता है।

gcc को पैरामीटर वाले फ़ंक्शन को कॉल करते समय तर्क &x स्वीकार करना चाहिए। असंगत प्रकार के लिए चेतावनी आईएमएचओ है तो gcc में एक बग है।

(इस बग शायद gcc बस क्योंकि gcc पिछले gcc संस्करणों में -Wwrite-strings साथ (एक और बग) एक const char (*)[4] रूप &x की पहचान करने में विफल रहा है के पिछले संस्करणों में दिखाने नहीं था। मैं gcc4.9.2 और gcc-6-20151206 के साथ परीक्षण किया।)

संबंधित मुद्दे