日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

对没有标记为安全的activex控件进行初始化和脚本运行_新的C++安全编码规则出炉...

發布時間:2025/4/5 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对没有标记为安全的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++安全编码规则出炉...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。