2010-02-23 104 views
7

使用std copy函數時出現警告。我有一個byte我聲明的數組。使用std :: copy的問題

byte *tstArray = new byte[length]; 

然後,我有被聲明,並與我想根據一些初始用戶輸入使用一些十六進制值初始化的幾個其他的字節數組。

我有一系列的if語句基本上解析出原始輸入,並基於某個字符串,我選擇使用哪個字節數組,然後將結果複製到原始tstArray中。

例如:

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

我得到的警告是 警告C4996:「的std ::複製」:帶參數 函數調用可能不安全 - 這個調用依賴於調用方檢查通過的 值是正確的。

一個可能的解決方案是禁用此警告是通過使用-D_SCL_SECURE_NO_WARNINGS,我認爲。那麼,這就是我正在研究的。

但是,我不確定這是否意味着我的代碼真的不安全,我實際上需要做一些檢查?

+0

不能似乎得到的代碼後... 例如 如果(substr1 == 「15」) { 的std ::法院<< 「使用字節數組評爲15」 <<的std :: ENDL ; std :: copy(ratedArray15,ratedArray15 + length,tstArray); } – djones2010 2010-02-23 21:38:10

+0

我爲你修好了。要發佈代碼,只需縮進四個空格並在代碼塊前後放置一個換行符。另外,編輯器中有一個按鈕可用於自動執行此操作。 – 2010-02-23 21:39:15

+0

這意味着你已經提出了一堆問題,但只有點擊了複選標記才能接受一個答案,因爲你提出的問題中有11%是正確答案。 – 2010-02-23 22:05:03

回答

9

C4996表示您正在使用標記爲__declspec(deprecated)的功能。可能使用D_SCL_SECURE_NO_WARNINGS將會#ifdef out棄用。你可以去閱讀頭文件來確定。

但問題是爲什麼不推薦使用? MSDN似乎沒有在std :: copy()頁面上提及它,但我可能看錯了。通常,這是在XPSP2的強大安全性推動過程中針對所有「不安全的字符串操作功能」完成的。由於您沒有將目標緩衝區的長度傳遞給std :: copy,因此如果您嘗試向其寫入太多數據,它將愉快地寫入緩衝區的末尾。

要說您的使用是否不安全將需要我們審查您的整個代碼。當他們以這種方式棄用一個功能時,他們通常會推薦一個更安全的版本。你可以用其他方式複製字符串。 This article似乎深入。他們似乎暗示你應該使用std :: checked_array_iterator而不是常規的OutputIterator。

喜歡的東西:

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

(如果我理解你的代碼右)

+5

'checked_array_iterator'不是std,但。 – UncleBens 2010-02-23 22:00:12

+1

是的,stdext不是一個有趣的地方,但是,棄用也不是標準。就個人而言,我從來沒有必要使用std :: copy()作爲字符數組;我寧願使用StringCchCopy(),儘管這也是微軟特有的。在可移植代碼中,我會編寫一個在非MSFT平臺上使用strncpy()的包裝器。 – 2010-02-23 22:04:18

+0

這是最有幫助的。唯一讓我有點困惑的是,當我去http://msdn.microsoft.com/en-us/library/aa985928(VS.80).aspx 和長度使用_count(array_name)然後我得到一個錯誤,說 編譯器錯誤C2784 '聲明':無法從'類型'推斷'類型'的模板參數 編譯器無法從提供的函數參數中確定模板參數。 但是當我使用確切的數組大小,在這種情況下,我知道然後它工作得很好。有任何想法嗎?除此之外它是最有幫助的。 – djones2010 2010-02-23 22:24:25

4

基本上,這個警告告訴你的是,你必須絕對確定tstArray指向一個足夠容納「長度」元素的數組,因爲std::copy沒有檢查。

1

嗯,我認爲微軟的STDLIB單方面棄用還包括通過向char*std::copy。 (他們實際上已經搞砸了全範圍的功能。)

我想它的部分有一些優點(fopen()觸及全球ERRNO,所以它不是線程安全的),但其它的決定似乎並不很理性。(我會說他們在整個事情上佔用了太多的空間,應該有級別,如非線程安全,不可檢查等)

我建議閱讀每個函數的MS-doc if你想知道關於每個案例的問題,但是爲什麼每個函數都有這個警告,並且每種情況下的原因通常都是不同的。

-1

至少看起來,VC++ 2010 RC不會在默認警告級別發出警告。

+0

忽略警告不是解決方案。至少,你應該理解爲什麼警告發生在你決定忽略它之前。 – 2010-02-23 22:00:21

+1

我不會無視它 - 我只是說VC++ 2010 RC不會再發射它了。 – 2010-02-23 22:06:47