2017-05-14 12 views
5

-Wsequence-point सक्षम के साथ, जीसीसी को उपयोगकर्ता को चेतावनी दी जानी चाहिए जब अपरिभाषित व्यवहार कोड देखा जाता है। उदाहरण के लिएइस उदाहरण में जीसीसी ने चेतावनी नहीं दी है

b = a + ++a; 

जीसीसी द्वारा देखा जाना चाहिए और जहां "अपरिभाषित व्यवहार" कोड सूचित किया जाना चाहिए (क्योंकि आईएसओ सी वर्धन के लिए ऑपरेंड के मूल्यांकन के क्रम निर्दिष्ट नहीं है)।

हालांकि, मैं वाक्य रचना के साथ खेला जाता है और मैं इस एक कोशिश की:

int *a = malloc(sizeof(int) * 2); 
a[0] = 1; 
printf("%d\n", *(a + (*a)++ - *a)); 

बेशक, मैं चेतावनी

चेतावनी मिल गया: पर '* एक' अपरिभाषित किया जा सकता है [आपरेशन - Wsequence सूत्री]

जो मैं क्या उम्मीद है, क्योंकि *a का मान (जो a[0] है) वृद्धि की जा सकती है या नहीं, जबकि हो सकता है तीसरे ऑपरेंड को संसाधित करना लेकिन, मैंने निम्नलिखित की कोशिश की:

int *a = malloc(sizeof(int) * 2); 
a[0] = 1; 
printf("%d\n", *(a + (*a)++ - 1)); 

मुझे आश्चर्य हुआ क्योंकि मुझे कोई चेतावनी नहीं मिली। क्या यह यूबी भी नहीं होना चाहिए? मेरा मतलब है, आईएसओ सी 99 के अनुसार, वृद्धि वृद्धि ऑपरेशन का मूल्यांकन किसी भी बिंदु पर अभिव्यक्ति मूल्यांकन (अल्पविराम ऑपरेटरों और टर्नरी ऑपरेटरों को छोड़कर) पर किया जा सकता है। मेरे बाद के उदाहरण में, मैं सूचक को बढ़ा नहीं रहा हूं, बल्कि इसके बजाय पूर्णांक यह इंगित करता है। इसलिए, मानक के अनुसार, इसे किसी भी बिंदु पर बढ़ाया जा सकता है (जिसका अर्थ यह है कि पूरे अभिव्यक्ति का मूल्यांकन करने के बाद इसे बढ़ाया जा सकता है), इसलिए प्रोग्राम 1 या 2 दोनों को प्रिंट कर सकता है, है ना?

जीसीसी कोई चेतावनी क्यों नहीं फेंकता है? या किसी को याद किया था? क्या मैंने चश्मा गलत तरीके से समझ लिया?

उत्तर

6

जीसीसी का स्टेटिक विश्लेषण उपकरण इस स्थिति को संभाल नहीं करता है।

अभिव्यक्ति *(a + (*a)++ - x) क्योंकि यह कुछ बहुत ही विशेष परिस्थितियों में अनुक्रम बिंदु की कमी के कारण अपरिभाषित व्यवहार में परिणाम है, जीसीसी के स्थिर विश्लेषण के लिए बहुत कठिन है - अर्थात्, जब *ax शामिल हैं। यह तब होता है जब (*a)++ - x एक-दूसरे को "पूर्ववत करें", इसलिए समग्र अभिव्यक्ति *a के साथ-साथ कुछ साइड इफेक्ट्स के बराबर हो जाती है।

इस त्रुटि को स्पॉट करने के लिए जीसीसी कोड विश्लेषण के लिए, कंपाइलर को पूरे जीवन भर में *a की सामग्री को ट्रैक करना होगा। यद्यपि यह आपके उदाहरण में सरल दिखता है, एक जटिल प्रोग्राम कहता है, जहां उपयोगकर्ता इनपुट से a में डेटा पढ़ा जाता है, ऐसे विश्लेषण को असंभव प्रस्तुत करता है।

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