2016-04-30 19 views
6

हाल cppcheck कुछ सी कोड में एक त्रुटि उठाया, संरचना है कि:क्या सीए ऑपरेटर और सी में अनुमानित मूल्यांकन के साथ मूल्यांकन का आदेश है?

((void)(value_prev = value), value = new_value()) 

ज्यादातर मामलों में यह 2 लाइनों पर विभाजित किया जा सकता है, हालांकि ऐसे कुछ मामलों रहे हैं यह एक एकल बयान में है करने के लिए उपयोगी है।

प्रैक्टिस में मैंने लोकप्रिय कंपेलरों (जीसीसी/क्लैंग/एमएसवीसी) के साथ यह काम पाया, जो (चेतावनी स्तर के साथ भी उनके उच्चतम पर सेट किए गए) के साथ कोई चेतावनी नहीं देते हैं


उदाहरण कोड:

#include <stdio.h> 

int get_next(int i); 

int main() { 
    int i = 0, i_prev = 10; 
    do { 
     printf("%d\n", i); 
    } while ((void)(i_prev = i), 
      (i = get_next(i)) != 10); 
} 

CppCheck 1.73 (नवीनतम लेखन के समय) इस कोड के साथ एक त्रुटि देता है:

(error) Expression '(void)(i_prev=i),(i=get_next(i))!=10' 
depends on order of evaluation of side effects` 

कोड बदला जा सकता है जबकि शांत करने के लिए चेतावनी, आदेश वास्तव में अपरिभाषित है?

+1

क्या यह हो सकता है कि get_next (i) एक मैक्रो है, जैसे #define getnext (i) i ++? – gnasher729

+1

नहीं, इस मामले में इसे फ़ंक्शन के रूप में परिभाषित किया गया है, cppcheck बिना किसी संशोधन के इस कोड पर त्रुटि देता है। – ideasman42

उत्तर

8

आदेश परिभाषित किया गया है, क्योंकि उनके बीच अनुक्रम बिंदु है। आईएसओ/आईईसी 9899 6.5.17 देखें:

एक अल्पविराम ऑपरेटर के बाईं संकार्य एक शून्य अभिव्यक्ति के रूप में मूल्यांकन किया जाता है; इसके मूल्यांकन के बाद एक अनुक्रम बिंदु है। फिर सही ऑपरेंड का मूल्यांकन किया जाता है; परिणाम का प्रकार और मूल्य है। 95) यदि किसी अल्पविराम ऑपरेटर के परिणाम को संशोधित करने के लिए कोई प्रयास किया गया है या अगले अनुक्रम बिंदु के बाद इसे एक्सेस किया गया है, तो व्यवहार अपरिभाषित है।

वे तो एक स्पष्ट उदाहरण दे: समारोह कॉल में


f(a, (t=3, t+2), c)
समारोह तीन तर्क, दूसरा जिनमें से महत्व है है 5.

मुझे पूरी तरह से यकीन नहीं है कि क्यों सीपीपी चेक इसे ध्वजांकित कर रहा है।

+0

अनुक्रम बिंदु एक C++ शब्द नहीं है? – Alex

+0

@Alex यदि यह है, तो सी 99 ने इसे सी ++ से उधार लिया। तुलना करने के लिए मेरे पास सी 99 की तुलना में पहले कोई सी चश्मा नहीं है। –

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