निम्नलिखित कार्यक्रम अपरिभाषित है व्यवहार:gcc -Wformat क्यों एक हस्ताक्षरित int पर printf% d के बारे में चेतावनी नहीं देता है?
#include <stdio.h>
int main(void)
{
unsigned int x = -100; // This is fine, becomes UINT_MAX - 100
printf("%d\n", x); // This is undefined behavior.
return 0;
}
C99 7.19.6.1p8 राज्यों% d किसी पूर्णांक तर्क की उम्मीद है।
C99 7.19.6.1p9 कहा गया है "किसी भी तर्क इसी रूपांतरण विनिर्देश के लिए सही प्रकार नहीं है, तो व्यवहार अपरिभाषित है।"
हालांकि, जीसीसी -Wformat
(जो -Wall
के साथ शामिल है) के ऊपर कार्यक्रम, क्यों के बारे में शिकायत नहीं होगा? क्या यह एक बग है, या एक जानबूझकर चूक?
जीसीसी मैनपेज से:
-Wformat
चेक "printf"
और "scanf"
, आदि के लिए, सुनिश्चित करें कि तर्क की आपूर्ति की प्रारूप स्ट्रिंग के लिए उपयुक्त प्रकार निर्दिष्ट करने के लिए कहता है, और है कि रूपांतरण स्वरूप में निर्दिष्ट स्ट्रिंग समझ
C99 6.3.1.3p3 पर हस्ताक्षर किए परिभाषित कार्यान्वयन है अहस्ताक्षरित के रूपांतरण कहते हैं। – jxh
@ user315052: कोई रूपांतरण नहीं है; 'x' (एक 'हस्ताक्षरित int' ऑब्जेक्ट) का प्रतिनिधित्व इस प्रकार व्याख्या किया गया है कि यह 'int' प्रकार का था। –
@ किथ थॉम्पसन: मुझे लगता है कि C99 7.15.1.1p2, अंतिम वाक्य के कारण है, जहां यह 'va_arg' मैक्रो के माध्यम से तर्क प्रकारों को परिवर्तित करते समय हस्ताक्षरित/हस्ताक्षरित के लिए अपवाद बनाता है। – jxh