【转】VS 安全开发生命周期(SDL)检查
【轉】VS 安全開發生命周期(SDL)檢查
前面在學習使用google的protobuf時在VS2012中一直無法編譯編譯通過,經過查找一些資料原來發現,并不是protobuf的問題,而是自己在使用VS2012時,沒有完全了解VS2012的強大功能,和跟以前VS2010的差別,導致無法編譯通過。
?
現在就來說說為什么沒有編譯通過,在VS2012創建項目時,會有一個勾選項,叫做“安全開發生命周期(SDL)檢查”,這個東西是微軟在VS2012新推出的東西,為了是能更好的監管開發者的代碼安全,如果勾選上這一項,那么他將嚴格按照SDL的規則編譯代碼,會有一些以前常用的函數無法通過編譯,比如在VS2010中的scanf是warning那么在VS2012中就是error了。
?
查看MSDN中對SDL的描述,SDL檢查會視以下告警為錯誤:
?
| C4146 | /we4146 | 一元負運算符應用于無符號類型,從而導致無符號結果。 |
| C4308 | /we4308 | 一個負整型常數轉換為無符號類型,從而導致一個可能無意義結果。 |
| C4532 | /we4532 | __finally?/finally中的關鍵詞,使用continue,?break?或?goto在異常終止塊未定義行為。 |
| C4533 | /we4533 | 初始化變量的代碼不會執行。 |
| C4700 | /we4700 | 使用未初始化的局部變量。 |
| C4703 | /we4703 | 對一個潛在的未初始化的局部指針變量的使用。 |
| C4789 | /we4789 | 當使用時,請緩沖區溢出特定 C 運行時 (CRT) 函數。 |
| C4995 | /we4995 | 使用函數的標deprecated。 |
| C4996 | /we4996 | 使用函數的標記作為deprecated。 |
?
也就是在編譯的時候,當SDL檢查啟用時,編譯器會嚴格檢測緩沖區的溢出,并且會在delete某個指針時,自動為這個指針定義一個非有效的值,防止在delete以后仍用到這個指針時出錯。還有就是會在你定義一個對象時,自動為這個對象賦值零。
?
從這些功能來看,有些功能還是不錯的,不但方便了程序員使用也增強了程序的健壯性,但是對老版本程序的兼容就會出現問題,以前程序中編譯通過的內容也許在VS2012中就沒有辦法通過,還是大家根據自己的習慣自行考慮是否使用這個東西吧。
?
另:還有一個選擇打開和關閉SDL檢查的位置就是:項目屬性->配置屬性->C/C++->SDL檢查,選測是或者否
?
轉自:http://blog.csdn.net/angle635/article/details/22035427
posted on 2018-02-11 09:47 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏
總結
以上是生活随笔為你收集整理的【转】VS 安全开发生命周期(SDL)检查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】6 个技巧,提升 C++11 的
- 下一篇: C++数组与指针回顾总结