在用 Visual Studio 編譯比較早的代碼時,經常會遇到錯誤:
錯誤 C4996 'wcscpy': This function or variable may be unsafe. Consider using wcscpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. BcpService e:\c800\pc\src\bcpservice\createindex.cpp 22
警告 C4200 使用了非標准擴展: 結構/聯合中的零大小數組 BcpService e:\c800\pc\src\bcpservice\libusb.h 738
錯誤 C4996 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. BcpService e:\c800\pc\src\bcpservice\creatbcpfile.cpp 534
等。。。
在項目屬性中關閉SDL檢查后就可以解決該問題。
當然,最好是修改代碼,使用錯誤提示中的修改。
但是某些情況下代碼不允許修改,就需要關閉SDL檢查。
什么是SDL檢查
微軟正在積極開發的Visual Studio11,不斷尋找方法,以提高安全相關的功能。作為這項工作的一部分,我們正在更新一些增強/ GS編譯器開關,這是默認,使基層的代碼生成的安全功能,超越了現在熟悉的基於cookie的堆棧溢出保護。這些在以后的文章,我們將提供一些細節。
安全開發生命周期(SDL)/ GS編譯器能協助安全軟件開發的范圍之外的建議。這些從具體的代碼生成功能,如使用安全相關的編譯器警告和更多的一般性建議適當初始化或消毒指針strict_gs_check范圍。
這是第一次,我們希望能提供一個中央機制,使這些額外的安全性支持通過一個新的/ SDL開關。 / SDL的影響是雙重的:
- / SDL SDL強制編譯器警告是在編譯過程中的錯誤處理。
- / SDL使額外的代碼生成功能,如增加了棧緩沖區溢出保護和指針初始化或消毒,在有限的一套明確界定的情況下的范圍。
這種雙管齊下的辦法,反映了我們的信念,安全軟件是最好的實現相結合的檢測,並固定在開發過程中代碼中的錯誤與安全緩解的部署,將顯着增加難以利用任何剩余的錯誤。
/ SDL的編譯器開關默認是禁用的,並且可以在Visual Studio的用戶界面,輕松地打開當前項目的屬性頁,並訪問配置屬性 - > C / C ++ - >常規選項啟用。
那么,是什么/ SDL開關嗎?
使一切都包含在/ GS/ SDL開關啟用的功能是啟用/ GS即啟用/ SDL的一個超集。我們將提供更多的背景和額外的/ GS/ SDL在未來職位的特點,在深入細節。現在,我們注意到,它們包括:
啟用下列SDL強制編譯器警告視為錯誤:
Warning |
Command line switch |
Description |
/we4146 |
A unary minus operator was applied to an unsigned type, resulting in an unsigned result |
|
/we4308 |
A negative integral constant converted to unsigned type, resulting in a possibly meaningless result |
|
/we4532 |
Use of “continue”, “break” or “goto” keywords in a __finally/finally block has undefined behavior during abnormal termination |
|
/we4533 |
Code initializing a variable will not be executed |
|
/we4700 |
Use of an uninitialized local variable |
|
/we4789 |
Buffer overrun when specific C run-time (CRT) functions are used |
|
/we4995 |
Use of a function marked with pragma deprecated |
|
/we4996 |
Use of a function marked as deprecated |
一個開發人員如想以選擇大部分的/ SDL的功能,但排除一個給定的警告編號(假設為例C4146)然后這可以通過在/ WD開關以禁用彗星/彗星++下,具體警告實現 - >命令行 - >附加選項在Visual Studio的用戶界面:
strict_gs_check pragma是適用於所有的C/ C + +代碼編譯/ SDL。這指示編譯器將考慮作為潛在的堆棧緩沖區溢出保護候選人更多的功能。Visual Studio 2010中引入的GS優化得到了提高strict_gs_check一起更好地工作,特別是使許多額外的安全檢查從strict_gs_check被證明是不必要的和刪除。
附加/ SDL代碼生成功能,將在以后的職位更詳細的覆蓋。
Microsoft強烈建議使用/ GS開關,因為在以往的Visual Studio版本,在Visual Studio11新/ SDL開關提供更大的保障覆蓋面的機會,期間和之后發展:停留在特定的安全利益,使用/ GS的更多細節調整在Visual Studio11和/ SDL。
當然,安全性開發生命周期(SDL)是一個完整的過程和開發安全的軟件,這樣的方法,包括遠遠高於只使用特定的編譯器開關 - 閱讀更多查找到SDL的額外資源。