国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

保衛(wèi)C++:安全STL編程中的受檢迭代子

2019-11-17 05:28:40
字體:
來源:轉載
供稿:網友

  C++語言、STL、標準C++庫,相比之C語言及C運行時庫(CRT)而言,更加現(xiàn)代、也更加健壯。正因為軟件的安全性與健壯性息息相關,所以在安全性方面,標準C++比C及CRT面臨的問題更少,那也就不足為奇了。然而,在標準C++中,仍存在一些漏洞,而且,Visual C++ 2005中的一項新增功能,使這個所謂的“循環(huán)漏洞”更加輕易被忽視。

  STL在橫向集合中,大量使用了迭代子(iterator),對迭代子不正確的使用,一般可以兩種主要的方式表現(xiàn)出來:

  ·使用已被集合修改為無效的迭代子

  ·使用迭代子試圖訪問集合范圍之外的一個元素

  以下的代碼演示了這兩種問題:

//使用一個無效的迭代子

vector vec;
vec.push_back(1);
std::vector::iterator it = vec.begin();
vec.push_back(2);
std::cout<<*it;
//試圖訪問迭代子范圍之外
vector emptyVec;
std::vector::iterator emptyIt = emptyVec.begin();
int i = *emptyIt;
  假如在Visual C++ 2005中,以Debug方式來構建上述代碼,這兩種情況都會引發(fā)斷言錯誤,所以要找到錯誤所在,并不是很難;假如以Release方式來構建,將不會捕捉到對無效迭代子的使用,但仍會捕捉到對集合外部數(shù)據的訪問。原因在于,Debug構建基于Visual C++中被稱為“調試迭代子支持”的那一部分,其是通過在運行時庫源代碼中進行檢查來實現(xiàn)的,而在默認情況下,Debug構建時是打開“調試迭代子支持”的,但你也能通過把符號_HAS_ITERATOR_DEBUGGING定義為一個零值來關閉它。

  “調試迭代子支持”——其主要集中在代碼正確性上,與之形成對比的是,Release構建概念中的受檢迭代子,其主要集中在防止程序運行中的安全問題。當有錯誤發(fā)生時,受檢迭代子通常產生一個運行時錯誤,默認情況下會終止程序,而不是拋出一個斷言。一般來說,可以有兩種方法來處理由受檢迭代子產生的錯誤:

  ·調用_set_invalid_parameter_handler,來設置一個非法參數(shù)處理程序。

  ·定義_SECURE_SCL_THROWS為1,其在拋出時導致一個異常。

  另外,為強制Visual C++與C++標準保持一致,并且不對迭代子進行檢查,你可以把_SECURE_SCL定義為零。

  受檢查迭代子適用于大多數(shù)STL容器類中的[ ]操作符,front和back方法;正因為算法在STL中扮演了一個重要的角色,所以與受檢迭代子進行集成,無疑對它們來說顯得至關重要。而在Microsoft安全部署中,最重要的一點就是,編譯器要在默認情況下打開安全選項,這也是受檢迭代子與STL算法中這些迭代子的使用情況。對一個使用了受檢迭代子的程序而言,所有對標準算法函數(shù)的調用,都會導致一個安全函數(shù)被調用,這意味著,假如調用一個std::merge,將會轉發(fā)至stdext::checked_merge。而在STL算法中,這些加有checked_ 前綴的版本防止了未受檢的迭代子,當使用第三方且是未用Visual C++ 2005重新編譯過的的組件時,就可以捕捉到這些未受檢迭代子了,任何試圖傳遞一個未受檢迭代子到受檢算法中的代碼,都不會通過編譯。

  Visual C++的安全增強與語言標準

  在以前,Microsoft公司為了其自己的種種商業(yè)利益,在很長一段時間里忽視或暗中攪亂C++語言的標準化進程;如今,Microsoft在許多的標準實體中,都扮演了一個重要且有幫助性的角色,作為一家在C++方面投資最大的公司,參與到“標準化”這個游戲當中來,無疑非常引人注目。

  C++/CLI如今已是一個ECMA標準,這意味著(如同標準C++一樣),任何編譯器開發(fā)商都可以構建一個C++/CLI語言編譯器。一個特定的C++/CLI編譯器可能會專注于CLR或一個完全不同的環(huán)境,如java的運行時庫;另外,對C++/CLI的反對聲音,宣稱因為基于C++/CLI與標準C++太過于不同,因此需要另外一個不同的名字。爭論的核心在于“C++/CLI已發(fā)展成為一個差不多、但又不完全不像我們所知的C++的語言,語法、語義、術語及底層對象模型,都大不相同。”但這個反對聲音并不奏效,如今C++/CLI已是一個完整版本的語言了。

  當前,Microsoft仍通過C標準化過程,著手對CRT的安全性進行修改,假如且當這些修改被認可,及Visual C++ 2005中帶 _s后綴的函數(shù)與Visual C++合成一體時,那么使用CRT編寫可移植及更安全的代碼,就不再是空中樓閣了。

  最后,在Visual C++ 2005中并沒有強制使用這些安全擴展或C++/CLI,假如你喜歡設置不同的#define,或者在某些情況中忽略編譯器的警告,那么,純凈、無瑕疵的C/C++代碼就正在向你招手。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 新闻| 诸城市| 华阴市| 乐东| 普陀区| 铜梁县| 松江区| 宁乡县| 奇台县| 兰西县| 沂水县| 石棉县| 信宜市| 天等县| 彝良县| 遵义市| 曲阳县| 定安县| 苍山县| 明星| 黄浦区| 永州市| 桓台县| 沂水县| 息烽县| 临潭县| 济源市| 天水市| 泰顺县| 平武县| 涟源市| 漳浦县| 淅川县| 云南省| 云梦县| 临泽县| 吴堡县| 仁布县| 新野县| 湖北省| 吉安市|