• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            蝸牛的家
            男兒當自強
            posts - 48,  comments - 21,  trackbacks - 0
            將以前的代碼在vc2005下編譯,經常會遇到類似如下的警告: warning C4996: 'strcat' was declared deprecated. 通常這類警告都是由于調用了字符串相關函數(shù)引起的。雖然這警告無傷大雅,僅僅只是說使用的函數(shù)已過時(deprecated)&lt;需要用新的函數(shù)來替代&gt;,但看著實在別扭,且看看ms為什么要設置成這樣。
                搜索了一下ms的網站,找到了結果。ms認為以前的c/c++庫中有一部分函數(shù)不夠安全,希望程序員可以使用他們的替代安全庫(Safe Library)來避免不必要的隱患。 整個原文請點擊以下鏈接訪問:Repel Attacks on Your Code with the Visual Studio 2005 Safe C and C++ Libraries  
                在網上搜索到的最常用的解決方案,那就是定義 _CRT_SECURE_NO_DEPRECATE 和 _SCL_SECURE_NO_DEPRECATE 來禁止vc2005對此產生警告(依然使用的是非安全庫!顯然并不是一個好的解決方案)。而且如果使用了ATL,則還需要定義 _ATL_SECURE_NO_DEPRECATE, 使用了MFC則需要定義 _AFX_SECURE_NO_DEPRECATE。然而盡管如此,更好的解決方案只需要定義一個宏 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES, 那么vc將會自動替換使用他們的Safe Library來代替C/C++標準庫(如strcat將被strcat_f來取代)。
                即使使用了_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES,代碼將依舊不夠安全:(, 對此,ms提出了如下10點建議:
                1. 不要認為 strcpy_s 和 strncpy_s( 以及其他的字符串函數(shù))(在空間不夠的時候)會自動終止拷貝(truncate截斷,不截斷則意味著溢出).如果需要自動截斷,請使用strncpy_s (同時使用_TRUNCATE作為長度參數(shù))。
                2. 記住fopen_s缺省是獨占模式。如需共享使用文件,應該使用_sopen。
                3. 別忘了_dupenv_s, 它將比_getenv_s更容易使用,因為它能自動分配一個正確長度的內存(buffer)。
                4. 在scanf_s中小心參數(shù)順序。
                5. 確定printf_s中格式字符串的正確。
                6. 使用_countof(x)來取代sizeof(x)/sizeof(element). _countof將會正確的計算元素個數(shù),而且如果x是一個指針,編譯器將會發(fā)出一個警告(來提醒程序員,僅針對C++編譯)
                7. 記住所有的sizes(大小,非長度)都是使用characters(字符,unicode下一個字符占2個byte)作為單位,而不是bytes(字節(jié)).
                8. 記住所有的sizes(大小,非長度,緣由同上)包含了字符串結束符'\0'(即別忘了很多情況下size需要+1)。
                9. 調試的時候監(jiān)視數(shù)據(jù)0xfd。 (在調試版本下)0xfd將會被填充在數(shù)據(jù)(buffer,通常是字符串)的結尾處。如果運行非你所愿,可能會得到一個長度錯誤。
                10. 檢查所有的錯誤。 許多新函數(shù)相比舊函數(shù),能返回(表示)錯誤信息(的數(shù)值)。
                今天在把以前的項目port到VC2005上來時,碰到了不少問題,大都和字符處理相關。VC2005中默認的字符處理函數(shù)都是調用雙字節(jié)版本,而且直接在代碼中輸入的字符串都默認為雙字節(jié)的。
                在項目的轉換Log中發(fā)現(xiàn)這一段:The C/C++ compiler default settings have been modified to be more compliant with ISO Standard C++. Included in those changes are enforcing Standard C++ for loop scoping and supporting wchar_t as a native type. These changes may cause existing code to no longer compile without changes to the code or the compiler options with which it is built.
                Standard C++ 有要求wchar_t作為默認的字符類型嗎?只好先在Project->Properties->Configuration Properties->C/C++->Language中的選項"Treate wchar_t as Build-in Type"設置為No
                還有一點就是VC2005的CRT用的是新版的Security-Enhanced Versions of CRT Functions,有關字符串處理的相關函數(shù)都被建議用后綴加上"_s"的版本,這樣的話,在從以前項目的轉換中會出現(xiàn)一大堆的warnings,做好的解決辦法是:在預編譯頭文件中的任何include之前加入:  
                //for Secure Template Overloads of Security-Enhanced Versions of CRT Functions
                #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
                定義這個宏就會默認使用Security-Enhanced CRT,即使你的代碼中用的并不是加后綴_s的函數(shù)版本,因為它在庫中使用了一個小技量:函數(shù)重載。
                但是即使你完全按照上面的做了,在編譯代碼的時候還是會出現(xiàn)一大堆煩人的warnings,你可能會說“我不是已經用新版的CRT了嗎?” 是的,沒錯!那是在鏈接的時候做的,但是編譯器在編譯你的代碼的時候并不清楚,它只認你上面寫的是什么,沒"xxx_s";,就給你好看!不讓它們出現(xiàn)有兩種辦法,我們首先想到的就是可以在預編譯頭文件里加上#pragma warning (disable :xxxx),這樣也不失為一個處理的辦法。另外一個是VS2005自帶MSDN中說明的辦法,同上,在stdafx.h沒include任何頭文件之前定義一個宏:
                //for no more warns about the Security-Enhanced Versions of CRT Functions
                #define _CRT_SECURE_NO_DEPRECATE
               【系統(tǒng)分析】【編譯】【代碼升級】升級到Visual C++ 2005庫要注意事項
                Visual C++庫的十項突破性變化</p><p>Visual C++ 2005庫已經發(fā)生了一系列的變化,可能會對現(xiàn)有的程序有所影響,在升級到Visual C++ 2005之前,必須要確定程序中沒有這些問題。
                1、參數(shù)的有效性
                在C運行時庫中,加入了一些代碼,以檢查參數(shù)的有效性。例如:如果傳遞的目標緩沖區(qū)大小不足以strcpy使用--通常這是在冒安全風險,而新版本此時則會調用一個非法參數(shù)處理程序。在release版中,會調用Dr.Watson;而在debug版中,會產生斷言(assert),當然,只要程序中傳遞的參數(shù)都是有效的,就不會有什么問題了。
                2、對非安全API的警告
                在Visual C++ 2005中,CRT中的一組函數(shù)已不再建議使用,而應使用新提供的安全版本。大多數(shù)這些不建議使用的函數(shù)如果使用不當,將會導致緩沖區(qū)溢出或其他安全問題,這些函數(shù)如:strcpy、strcat等等。這些函數(shù)新的安全版本都在函數(shù)名后加了一個_s后綴,以方便識別,如strcpy_s、wcscpy_s、mbscpy_s、calloc_s和strcat_s這些函數(shù)。如果想繼續(xù)使用老版本、非安全的函數(shù),可在源代碼開始處加上#define value of _CRT_SECURE_NO_DEPRECATE(此處value代表某一數(shù)值);然而,還是建議大家升級代碼使用新的安全函數(shù)。
                3、迭代器越界
                受檢查的迭代器(checked iterators)和調試迭代器(debug iterators)也因為安全的原因進行了相應的更新,如果迭代器越界,則相應會調用一個非法參數(shù)處理程序。再次提醒,可以通過拋出一個越界異常來避免產生非法參數(shù)問題。在代碼中加入#define value of _SECURE_SCL_THROWS,并把value值設為1,這樣就不會調用非法參數(shù)處理程序,而是產生一個異常了。也可以通過設置#defined value of _SECURE_SCL值為零,關閉此迭代器檢查,通常默認情況下,此選項是打開的。
                4、time_t類型
                time_t類型通常用于顯示從1970年開始以來的秒數(shù)。直到Visual C++ 7.1(即Visual C++ .NET 2003),time_t類型都被定義為一個long,而到了Visual C++ 2005中,已被定義為一個64位類型,可用于顯示一直到3000年的時間了。
                5、鏈接到CRT
                托管應用程序現(xiàn)在不能靜態(tài)鏈接到CRT。以往,在Visual C++ 7.0和7.1中(指Visual Studio .NET 2002與2003),可以生成靜態(tài)鏈接到CRT的CLR程序,而在Visual Studio 2005卻行不通。
                6、單線程CRT支持
                在Visual Studio 2005中,已經取消了單線程CRT支持。而且用發(fā)展的眼光來看,未來大多數(shù)的人還是愿意使用線程安全的多線程代碼。<br />在線程中,可使用_nolock后綴來優(yōu)化代碼,但同時,這些函數(shù)是非線程安全的。
                7、異常處理
                有兩種類型的異常處理可供選擇:/EHa(異步的)和/EHs(同步C++異常)。在以前,如果使用了/EHs,那么在一個catch(…)塊中,也許可能、也許不可能捕捉到結構化異常,因為此行為是沒有定義且不可靠的;現(xiàn)在,再使用/EHs時,就可保證不會捕捉到結構化異常。如果想與以前版本的Visual C++保持一致,并且捕捉異步結構化異常,還是應該在編譯時使用/EHa。
                8、初始化順序
                以往,如果代碼中同時有托管與本地全局變量及對象,那么初始化順序是不確定的;如代碼中存在托管對象與本地對象互操作,就不能保證哪一個對象先初始化了。現(xiàn)在,Visual Stuio 2005可保證所有的本地全局變量及對象先初始化,然后才初始化托管全局變量及對象。
                9、printf
                就目前來說,printf中的%n格式化指示符一般用于指定輸出的字符個數(shù)。這已經確認為一個安全隱患,并且已禁用,但可以使用set_printf_count_output來啟用它;通過傳遞給set_printf_count_output一個零值(0)可禁用它,而傳遞任意一個其他值可再次啟用。
               10、swprintf函數(shù)
                為與C++標準保持一致,對swprintf函數(shù)也作了修改,現(xiàn)在它已遵循C++標準了。在C++中,通過適當?shù)膮?shù),可實現(xiàn)重載;這個函數(shù)的老版本已不再建議使用,因為在C中,是不允許重載的,因此如果使用老格式,將會返回一個錯誤。
                編譯器中的突破性變化
                除了那些會影響到庫的變化之外,也有一些變化會影響到編譯器。以下是Visual C++ 2005中編譯器的主要變化,需再次提醒的是,此處并沒有列出所有的變化,但卻是微軟公司VC++使用者及內部合作者所確認的關鍵性變化。
                指向成員的指針
                在之前的版本中,一個指向成員的指針不需使用取址操作符(&)就能獲取,現(xiàn)在,Visual C++ 2005已經嚴格按照標準,必須要使用取址操作符,這也有助于消除潛在的運行時錯誤。但也導致了MFC庫的許多地方需要修改,同時意味著,可能會對現(xiàn)有的程序造成影響。
                范圍限制規(guī)則
                在for循環(huán)聲明中,默認情況下不強制執(zhí)行范圍限制規(guī)則。在之前的版本中,for循環(huán)中變量的生命期將會延續(xù)到循環(huán)之外,為與標準兼容,for循環(huán)中定義的變量,現(xiàn)在只限定在for循環(huán)內使用。
                wchar_t類型
                現(xiàn)在,wchar_t已為默認內置類型。這就是說,也許在以前,wchar_t可能會被當作一個unsigned short,因為它還不是內置類型,所以,當與那些有wchar_t類型變量的文件作符號比較時,很可能會導致問題。在Visual C++ 2005中,wchar_t已是一個內置類型,也就是說,需要確定以前對wchar_t的用法不會導致轉譯為一個unsigned short。
                異常處理
                為了與庫的變化保持一致,編譯器已作了一些修改,以便不會捕捉到結構化異常。所以,為與以前代碼保持兼容,還是應該使用/EHa。
                參數(shù)屬性
                為了提供更健壯的屬性--也是為了代碼的健壯性,編譯器現(xiàn)在將會檢查類型、枚舉等等的屬性。這意味著,以前的代碼可能會在屬性方面碰到一個從未有過的編譯器錯誤。
                默認為int
                為遵循C++標準,對沒有類型聲明的變量或函數(shù),已不再默認為int類型。但在C語言中仍然可以,C++語言中已不行。這甚至也影響到了微軟公司自身的代碼,包括NT系統(tǒng)的代碼,所以最好的方式,還是顯式聲明。
                關于C的托管代碼
                C語言編譯器一般不可能創(chuàng)建CLR的托管代碼,因為C語言不是面向對象的,它不符合CLR所使用的模型,因此,任何以C語言來編譯的代碼都會與CLR編譯器設置沖突。例如,如果在編譯時使用/TC設置,而且又設置了CLR,就會導致沖突。
                面向CLR的新語法
                通過設置/clr編譯選項,C++編譯器只接受新語法。這將強制推廣加入到Visual C++ 2005中的新語法,同時,也會廢棄掉老代碼。
                安全檢查
                在安全越來越得到重視的今天,安全檢查選項/GS,在默認情況下就是打開的,還是有一定道理的。在Visual C++ 2005中,默認情況下將會使用/GS選項。
                結論:本文列出了微軟公司已確認的Visual C++ 2005中的一些關鍵性變化,雖然不是所有的變化,也不是最有可能沖擊到代碼的變化,但此處所列出的項目,將最有可能導致問題的產生。歸根結底,在升級或用新版編譯器對程序作修改之前,必須先試著編譯現(xiàn)有程序,以確認代碼能通過編譯,否則,就不可避免要動手修正源代碼中存在的問題。
            posted on 2008-10-17 14:49 黑色天使 閱讀(632) 評論(0)  編輯 收藏 引用 所屬分類: VC&MFC

            <2008年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久无码专区国产精品发布| 久久久久久夜精品精品免费啦| 国产69精品久久久久APP下载| 久久99国产亚洲高清观看首页| 久久精品人人做人人爽电影| 久久综合视频网| 日韩久久久久中文字幕人妻| 久久久久亚洲AV成人网| 94久久国产乱子伦精品免费| segui久久国产精品| 久久久国产精品| 亚洲Av无码国产情品久久| 亚洲精品无码久久不卡| 亚洲欧美国产精品专区久久 | 久久久久久毛片免费播放| 伊人久久大香线焦AV综合影院 | 久久国产三级无码一区二区| 99久久精品九九亚洲精品| 国产香蕉97碰碰久久人人| 蜜桃麻豆www久久国产精品| 久久亚洲国产成人影院| 无码人妻久久一区二区三区| 久久久亚洲欧洲日产国码aⅴ| 77777亚洲午夜久久多喷| 国产精品午夜久久| 思思久久99热只有频精品66| 亚洲国产精品无码久久久秋霞2| 色狠狠久久AV五月综合| 热久久这里只有精品| 一本久道久久综合狠狠躁AV| 人人狠狠综合久久88成人| 日本道色综合久久影院| 中文精品99久久国产 | 久久综合狠狠综合久久| 久久99国产精品二区不卡| 久久综合视频网站| 国产成人久久AV免费| 久久AAAA片一区二区| 久久精品国产网红主播| 久久久精品久久久久久 | 国产精品久久久久久久午夜片|