2010-02-23 13 views
7

का उपयोग करने के साथ समस्या std प्रतिलिपि फ़ंक्शन का उपयोग करते समय मुझे चेतावनी मिल रही है।std :: copy

मेरे पास byte सरणी है जो मैं घोषित करता हूं।

byte *tstArray = new byte[length]; 

तो मैं कुछ अन्य बाइट सरणियों कि घोषित कर दिया और कुछ हेक्स मान है कि मैं कुछ प्रारंभिक उपयोगकर्ता इनपुट के आधार पर उपयोग करना चाहते हैं के साथ प्रारंभ कर रहे हैं।

मेरे पास मूलभूत इनपुट को मूल रूप से विश्लेषण करने के लिए उपयोग किए जाने वाले बयानों की एक श्रृंखला है, और कुछ स्ट्रिंग के आधार पर, मैं चुनता हूं कि कौन सा बाइट सरणी उपयोग करने के लिए और ऐसा करने से परिणाम मूल tstArray में कॉपी करें।

उदाहरण के लिए: 'std :: प्रतिलिपि': मापदंडों साथ समारोह कॉल कि असुरक्षित हो सकता है - इस कॉल फोन करने वाले है कि जाँच करने के लिए पर निर्भर करता है

if(substr1 == "15") 
{ 
    std::cout<<"Using byte array rated 15"<<std::endl; 
    std::copy(ratedArray15,ratedArray15+length,tstArray); 
} 

चेतावनी मैं मिल चेतावनी C4996 है उत्तीर्ण मान सही हैं।

इस चेतावनी को अक्षम करने का एक संभावित समाधान है- D_SCL_SECURE_NO_WARNINGS, मुझे लगता है। खैर, यही वह है जो मैं शोध कर रहा हूं।

लेकिन, मुझे यकीन नहीं है कि इसका मतलब है कि मेरा कोड वास्तव में असुरक्षित है और मुझे वास्तव में कुछ जांच करने की आवश्यकता है?

+0

नहीं कर सकते कोड पोस्ट करने के लिए प्राप्त करने के लिए लग रहे हैं ... उदाहरण के लिए अगर (substr1 == "15") { std :: अदालत << "का उपयोग करना बाइट सरणी 15 रेटेड" << std :: endl ; std :: प्रतिलिपि (रेटेडएरे 15, रेटेडएरे 15 + लंबाई, tstArray); } – djones2010

+0

मैंने इसे आपके लिए तय किया है। कोड पोस्ट करने के लिए, बस चार रिक्त स्थान इंडेंट करें और कोड ब्लॉक से पहले और बाद में एक नई लाइन डालें। साथ ही, संपादक में एक बटन है जिसे आप स्वचालित रूप से करने के लिए उपयोग कर सकते हैं। –

+0

इसका मतलब है कि आपने प्रश्नों का एक समूह पूछा है, लेकिन आपके द्वारा पूछे गए प्रश्नों के 11% में "सही" उत्तर के रूप में एक उत्तर को स्वीकार करने के लिए केवल चेकमार्क पर क्लिक किया गया है। –

उत्तर

9

C4996 का अर्थ है कि आप एक फ़ंक्शन का उपयोग कर रहे हैं जिसे __declspec(deprecated) के रूप में चिह्नित किया गया था। संभवतः D_SCL_SECURE_NO_WARNINGS का उपयोग करके बहिष्करण को #ifdeff कर दिया जाएगा। निश्चित रूप से जानने के लिए आप हेडर फ़ाइल पढ़ सकते हैं।

लेकिन सवाल यह है कि इसे क्यों हटा दिया गया है? एमएसडीएन std :: copy() पृष्ठ पर इसके बारे में कुछ भी नहीं कहता है, लेकिन मैं गलत को देख रहा हूं। आमतौर पर यह XPSP2 के महान सुरक्षा धक्का के दौरान सभी "असुरक्षित स्ट्रिंग मैनिपुलेशन फ़ंक्शंस" के लिए किया गया था। चूंकि आप अपने गंतव्य बफर की लंबाई std :: प्रतिलिपि तक नहीं पारित कर रहे हैं, यदि आप इसे बहुत अधिक डेटा लिखने का प्रयास करते हैं तो यह खुशी से बफर के अंत में लिख जाएगा।

यह कहने के लिए कि आपका उपयोग असुरक्षित है या नहीं, हमें आपके पूरे कोड की समीक्षा करने की आवश्यकता होगी। आमतौर पर एक सुरक्षित संस्करण होता है जब वे इस तरीके से किसी फ़ंक्शन को बहिष्कृत करते हैं। आप तारों को किसी अन्य तरीके से कॉपी कर सकते हैं। This article गहराई में जाना प्रतीत होता है। ऐसा लगता है कि आपको नियमित आउटपुट इटरेटर के बजाय std :: check_array_iterator का उपयोग करना चाहिए।

कुछ की तरह:

stdext::checked_array_iterator<char *> chkd_test_array(tstArray, length); 
std::copy(ratedArray15, ratedArray15+length, chkd_test_array); 

(। अगर मैं अपने कोड सही समझते हैं)

+5

'check_array_iterator' std नहीं है, हालांकि। – UncleBens

+1

हाँ, stdext खेलने के लिए एक मजेदार भूमि नहीं है। हालांकि, बहिष्करण मानक भी नहीं है। व्यक्तिगत रूप से मुझे चरित्र सरणी के लिए std :: copy() का उपयोग करने की आवश्यकता नहीं थी; मैं StringCchCopy() का उपयोग करने के बजाय पसंद करता हूं, हालांकि यह माइक्रोसॉफ्ट विशिष्ट भी है। पोर्टेबल कोड में मैं एक रैपर लिखूंगा जो गैर-एमएसएफटी प्लेटफार्मों पर strncpy() का उपयोग करता है। –

+0

यह सबसे उपयोगी था। एकमात्र चीज जिसने मुझे थोड़ा परेशान किया है वह यह है कि जब मैं http://msdn.microsoft.com/en-us/library/aa985928(VS.80).aspx पर जाता हूं और लंबाई के लिए _count (array_name) तो मुझे एक त्रुटि मिलती है जो कंपाइलर त्रुटि C2784 'घोषणा': 'प्रकार' के लिए 'प्रकार' के लिए टेम्पलेट तर्क को घटा नहीं सकता संकलक आपूर्ति किए गए फ़ंक्शन तर्कों से टेम्पलेट तर्क निर्धारित नहीं कर सकता है। लेकिन जब मैं सटीक सरणी आकार का उपयोग करता हूं जो इस मामले में मुझे पता है तो यह ठीक काम करता है। कोई विचार? इसके अलावा यह सबसे उपयोगी था। – djones2010

4

असल में, यह चेतावनी आपको क्या बताती है कि आपको पूरी तरह से यह सुनिश्चित करना होगा कि tstArray "सरणी" तत्वों को पकड़ने के लिए काफी बड़ा है, std::copy यह जांच नहीं करता है।

1

ठीक है, मैं stdlib के माइक्रोसॉफ्ट के एकतरफा निंदा भी std::copy करने के लिए char* गुजर शामिल मान। (वे वास्तव में काम करता है की एक पूरी श्रृंखला के साथ गड़बड़ कर दिया है।)

मुझे लगता है इसके कुछ हिस्सों कुछ योग्यता है (fopen() छू लेती है वैश्विक ERRNO, तो यह थ्रेड-सुरक्षित नहीं है), लेकिन अन्य फैसले बहुत तर्कसंगत नहीं है।(मैं कहूंगा कि उन्होंने पूरी चीज पर बहुत बड़ा swathe लिया। वहाँ होना चाहिए, जैसे गैर थ्रेडसेफ, गैर-जांच योग्य, आदि)

मैं प्रत्येक समारोह पर एमएस-डॉक्टर पढ़ने की सिफारिश करता हूं अगर आप प्रत्येक मामले के बारे में मुद्दों को जानना चाहते हैं, हालांकि यह बहुत अच्छी तरह से प्रलेखित है कि प्रत्येक कार्य में यह चेतावनी क्यों होती है, और आम तौर पर प्रत्येक मामले में कारण अलग होता है।

-1

कम से कम ऐसा लगता है कि वीसी ++ 2010 आरसी डिफ़ॉल्ट चेतावनी स्तर पर उस चेतावनी को उत्सर्जित नहीं करता है।

+0

चेतावनी को अनदेखा करना कोई समाधान नहीं है। आपको कम से कम समझना चाहिए कि इससे पहले कि आप इसे अनदेखा करने का फैसला करें, चेतावनी क्यों हो रही है। –

+1

मैं इसे अनदेखा नहीं कर रहा हूं - मैं बस कह रहा हूं कि वीसी ++ 2010 आरसी अब इसे उत्सर्जित नहीं करता है। –

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