(अल्पविराम अभिव्यक्ति विभाजित) जबकि हमारे कोड (C++) के कुछ डिबगिंग मैं इस पाया:reinterpret_cast विचित्रता
inline std::string BufferToStr(
const unsigned char* buffer,
int index,
size_t length)
{
std::string retValue(reinterpret_cast<const char*>(&buffer[index], length));
return retValue;
}
इस कोड के साथ इस मुद्दे (सूचक और स्ट्रिंग लंबाई चेकों की कमी की ओर मुख) कि बंद है reinterpret_cast
के कंस्ट्रैसिस length
के बाद रखा गया है जब यह &buffer[index]
के बाद किया जाना चाहिए था। सबसे पहले मैंने सोचा कि यह संकलक (वीएस2013 का उपयोग करके) के साथ एक मुद्दा था लेकिन वीएस2012 और जीसीसी 4.6.3 दोनों का उपयोग करके इसे सफलतापूर्वक संकलित करने के बाद, मैं इस निष्कर्ष पर आया हूं कि यह किसी कारण से अनुमति है। कोड या तो विंडोज या लिनक्स पर नहीं चलेंगे क्योंकि लंबाई पैरामीटर पॉइंटर के रूप में उपयोग किया जाता है।
तो मेरा सवाल यह है कि यह संकलन क्यों करता है? reinterpret_cast
के दस्तावेज़ीकरण को देखते हुए मुझे इस पर कोई दस्तावेज नहीं मिल रहा है कि आप इसे अल्पविराम से अलग मूल्यों की सूची पास कर सकते हैं और इसके साथ क्या करेंगे।
इसे संकलित क्यों नहीं करना चाहिए? आप कंपाइलर को 'size_t' को' const char * 'पर डालने के लिए कह रहे हैं, और यह ऐसा करता है। इसे अनुमति देने की आवश्यकता नहीं है। – Damon
ध्यान दें कि चेतावनी को सक्षम करने से 'जीसीसी' का उपयोग करके एक उदाहरण के साथ मेरे उत्तर में दिखाए गए अनुसार एक मजबूत संकेत दिया गया होगा। –