对没有标记为安全的activex控件进行初始化和脚本运行_新的C++安全编码规则出炉...
新的安全編碼規則
在Visual Studio v16.8 Preview 3中,我們添加了一些新的安全編碼規則,來幫助開發者更容易找到一些更加容易導致Bug的編碼錯誤,這些錯誤涵蓋了從簡單的功能缺失到嚴重的安全漏洞問題。
這些規則都是來自于真實世界的產品缺陷報告,在微軟,我們會在我們的每一款產品中運行這些安全編碼規則,以滿足產品在安全和合規方面的需求。
在今天的文章中,我們會介紹VARIANT及其衍生的VARIANTARG和PROPVARIANT結構相關的編碼規則。為了更加容易的使用這些規則,我們構建了一個名為VariantClear的代碼分析擴展工具,這個擴展將會檢測代碼是否符合預期的編碼規則。為什么叫這個擴展為VariantClear呢?因為它的主要目的就是為了檢測那些誤用VariantClear函數的代碼。
VariantClear擴展將會檢測出如下的代碼警告:
> C33001: VARIANT ‘var’ 在它被反初始化時被重置。
> C33004: VARIANT ‘var’ 在它被初始化之前被重置,且它被標記為輸出(Out)參數。
> C33005: VARIANT ‘var’ 被標記為輸入或輸入/輸出參數,但是它沒有被初始化。
VariantClear 規則
VARIANT是一個非常方便好用的結構體,可以使用它來對各種不同的數據類型進行數據交換。在任意時刻,它都可以被用來表示一個數據類型,或者空值。在這個結構體中有一個名為VARIANT::vt的成員,用來表示被封裝的數據類型或者空值類型。
一個VARIANT結構必須被在使用或者傳入到其他代碼之前進行顯式的初始化。否則,就會出現訪問隨機內存數據的問題,進而帶來各種意想不到的Bug。
當一個VARIANT結構體不再使用的時候,也需要將它顯式的重置。否則,會出現潛在的資源泄露或者對已離開其作用域的資源的錯誤訪問。
通常,可以使用VariantInit函數來對一個VARIANT結構體進行初始化。對應地,可以使用VariantClear函數對它進行重置。
另外,還有一些對VARIANT結構的高級封裝結構,例如CComVariant和_variant_t。
在構造階段,它們的構造函數將調用VariantInit來對結構進行初始化,并將其數據類型設置為空值類型。
在析構階段,它們的析構函數將調用VariantClear來對結構體進行銷毀并將數據類型設置回空值。
VariantClear規則將嘗試對目標代碼進行分析,并對那些沒有對VARIANT結構體進行合適的初始化或反初始化的代碼給出提示。
C33001警告
當一個未初始化的VARIANT結構體傳遞給一個會使用VariantClear函數來重置VARIANT的API的時候,會觸發這個警告。
因為,這類API會期待傳入的VARIANT結構體是已經初始化的。但是很多開發者總是會忘記初始化這個步驟。
下面是一個簡單的例子:
在上面的代碼中,會觸發C33001警告。因為VARIANT結構體僅在some_condition為true時才會被初始化。如果這個標志為false,則當它傳遞給VariantClear函數時是未初始化的。
為了修復這個問題,我們可以以如下的方式修改代碼,確保調用VariantClear時結構體肯定是經過初始化的。 如下圖所示:
C33004警告
當一個VARIANT結構體被標記為Out參數,而這個參數可能在輸入的時候并沒有被初始化,當它進一步被傳遞給一個會使用VariantClear函數來重置這個結構體的API時,會觸發此警告。
當調用一個函數的時候,一個被標記為Out的參數并不一定會被初始化。只有當它函數返回的時候,它才會被初始化。
從更加安全的角度來看,在進行代碼分析的時候,一個Out參數被認為是未初始化的。如果當這個參數被傳遞到一個函數,而這個函數可能會使用VariantClear操作這個結構體時,它會嘗試重置這個結構體,或者使用內存里的隨機數據。下面是一個簡單的例子:
為了修復這個問題,可以在訪問Out參數時對它進行初始化,如下圖所示:
C33005警告
當一個未初始化的VARIANTBeijing傳遞給一個需要輸入型參數的函數的時候,會觸發此警告。
如下圖所示:
通過這個C33005警告,我們可以更加清楚地明白為什么C44004警告會被觸發。
當一個未經初始化的VARIANT的結構體被當做一個輸入型參數傳遞的時候,會顯式地違反C33005規則。
如何在Visual Studio中啟用新的規則
下圖中列出了可以用在工程上的不同的規則,可以根據這個表格在Visual Studio中啟用規則。
總結
當里個當,聲明變量的時候,還是不要忘記初始化。
最后
Microsoft Visual C++團隊的博客是我非常喜歡的博客之一,里面有很多關于Visual C++的知識和最新開發進展。大浪淘沙,如果你對Visual C++這門古老的技術還是那么感興趣,則可以經常去他們那(或者我這)逛逛。
本文來自:《New Safety Rules in C++ Code Analysis》
總結
以上是生活随笔為你收集整理的对没有标记为安全的activex控件进行初始化和脚本运行_新的C++安全编码规则出炉...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电铃的外部叫什么名字?
- 下一篇: 我爱我家总部在哪里 寻找我爱我家总部的地