1. 程式人生 > >【Visual Studio 2015】安全開發生命週期(SDL)檢查

【Visual Studio 2015】安全開發生命週期(SDL)檢查

    有的時候寫的程式碼明明沒有什麼問題就是編譯不過,我就覺得奇怪了。我是編譯通過的程式碼,怎麼就有問題呢?在VS2015執行,還真是有問題。看錯誤提示,是VS將這個函式的使用當做錯誤對待了!

     在以前的VS版本中,檢測並不嚴格,對於很多警告,我們程式設計師通常都是忽略,只要不報錯,懶得管。可能是微軟發現了這個情況,做了更嚴格的檢測。將這些警告變成了錯誤,所以,就讓你編譯通不過了。這樣逼著你用一種安全模式的函式版本,就是在後面加上_s,_s表示safe,代表安全版本,編譯時會做一定的安全檢測。以前曾研究過,實際上這並不能百分之百杜絕安全問題。

    安全版函式只是做了有限的檢測而已,可以杜絕一些問題而已。現在VS2015竟然做到這個地步,逼得這麼緊。這不僅是Windows 10安全性變高了,而且還要逼程式設計師提高安全性編碼呀!
開始我還以為降低警告安全級別即可,實際上並不行。警告級別是設定VS檢測警告的範圍程度,但是這個問題歸結為了錯誤,就不是警告所能設定的。為什麼會出現這個問題呢?

    在建立專案時,或許你會發現,在建立專案嚮導時多了一個選項,而且是預設選中的,那就是“安全開發生命週期(SDL)檢查(C)”。如下圖所示:


    預設這個檢查之後,再也不能好好擼程式碼了。對程式碼做了很多安全性檢測,也是防止很多錯誤出現。這樣的話,就將這些警告變成了錯誤來提醒,促使你更加安全的編寫程式碼咯。
    如果開始你不知道,然後就預設勾上了,沒關係,你可以在專案屬性中去掉這個設定。第一步就是點開專案的屬性對話方塊,如下圖所示:

        然後找到“安全開發生命週期(SDL)檢查(C)”,然後設定為“否”,然後確定,OK搞定!如下圖所示:
        這樣就可以和以前一樣放心擼程式碼了。這樣是讓限制更少,但是你自己一定要注意不要用錯了,出錯的責任就是你自己了。
    如果你想自己程式碼更加安全些,少些Bug,可以和前面說的那樣,使用_s版的安全版函式即可。反正出現過SDL的專案,就會有這樣的問題。所以注意一下。我想很多人對於SDL都很陌生吧,這裡就瞭解一下咯。

    雖然安全開發生命週期(SDL)檢查是可以防止一些錯誤發生,提高一定的安全性,但是,安全版本的函式並不是百分百安全的,程式設計師還是需要注意。

########################################################

Visual Studio開啟了SDL檢查後,某些警告會成為錯誤,是程式編譯不通過,例如:

error C4703: 使用了可能未初始化的本地指標變數

error C4996: 'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strdup. See online help for details.

等。。。

關閉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

C4146

/we4146

A unary minus operator was applied to an unsigned type, resulting in an unsigned result

C4308

/we4308

A negative integral constant converted to unsigned type, resulting in a possibly meaningless result

C4532

/we4532

Use of “continue”, “break” or “goto” keywords in a __finally/finally block has undefined behavior during abnormal termination

C4533

/we4533

Code initializing a variable will not be executed

C4700

/we4700

Use of an uninitialized local variable

C4789

/we4789

Buffer overrun when specific C run-time (CRT) functions are used

C4995

/we4995

Use of a function marked with pragma deprecated

C4996

/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的額外資源。

轉載:

https://blog.csdn.net/bytxl/article/details/46706215

########################################################