自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

闡述各種條件下的C++安全性問題

開發(fā) 后端
通過上面對C++安全性的講述,相信我們對虛函數(shù)表有一個比較細致的了解了,下面,讓我們來看看我們可以用虛函數(shù)表來干點什么壞事吧。

C++安全性的細節(jié)太多,就算都看過了,也不可能都記住。更關鍵的是,就算都記住了,也不能讓你成為一個真正的好程序員,看完本文你肯定有不少收獲,希望本文能教會你更多東西。

通過父類型的指針訪問子類自己的虛函數(shù)

我們知道,子類沒有重載父類的虛函數(shù)是一件毫無意義的事情。因為多態(tài)也是要基于函數(shù)重載的。雖然在上面的圖中我們可以看到Base1的虛表中有Derive的虛函數(shù),但我們根本不可能使用下面的語句來調用子類的自有虛函數(shù):

任何妄圖使用父類指針想調用子類中的未覆蓋父類的成員函數(shù)的行為都會被編譯器視為非法,所以,這樣的程序根本無法編譯通過。但在運行時,我們可以通過指針的方式訪問虛函數(shù)表來達到違反C++安全性的行為。(關于這方面的嘗試,通過閱讀后面附錄的代碼,相信你可以做到這一點)#t#

另外,如果父類的虛函數(shù)是private或是protected的,但這些非public的虛函數(shù)同樣會存在于虛函數(shù)表中,所以,我們同樣可以使用訪問虛函數(shù)表的方式來訪問這些non-public的虛函數(shù),這是很容易做到的。

  1. class Base {   
  2.  
  3. private:   
  4.  
  5. virtual void f() { cout << "Base::f" << endl; }   
  6.  
  7. };   
  8.  
  9. class Derive : public Base{   
  10.  
  11. };   
  12.  
  13. typedef void(*Fun)(void);   
  14.  
  15. void main() {   
  16.  
  17. Derive d;   
  18.  
  19. Fun pFun = (Fun)*((int*)*(int*)(&d)+0);   
  20.  
  21. pFun();   
  22.  
  23. }  

C++安全性是一種很難的問題,對于程序員來說,我們似乎永遠摸不清楚這門語言背著我們在干了什么。需要熟悉這門語言,我們就必需要了解C++里面的那些東西,需要去了解C++中那些危險的東西。不然,這是一種搬起石頭砸自己腳的編程語言。

C++安全性是這些“創(chuàng)新”的土壤,是的,我說的就是無窮無盡的workarounds和慣用法。但問題是,這些“創(chuàng)新”其實根本不是創(chuàng)新,你必須認識到的是,他們都只不過是在沒有first-class解決方案的前提下不得已折騰出來的替補方案。是的,它們某種程度上的確可以叫創(chuàng)新,甚至研究可行的解決方案本身也是一件非常有意思的事情。

責任編輯:chenqingxiang 來源: 51CTO
相關推薦

2013-04-10 10:54:13

Hadoop大數(shù)據(jù)大數(shù)據(jù)安全

2015-04-21 10:21:49

2010-03-02 16:34:36

WCF線程

2021-10-12 16:11:19

區(qū)塊鏈安全比特幣

2010-01-11 15:55:51

C++語言

2010-01-13 18:49:54

C++的復雜性

2011-01-10 10:45:09

2009-07-21 08:45:57

Google操作系統(tǒng)Chrome系統(tǒng)安全性

2009-07-21 10:17:06

Chrome操作系統(tǒng)安全性

2018-07-16 15:31:15

2018-02-27 10:49:53

5G遷移安全

2012-09-29 10:22:36

2010-01-11 09:28:34

C++編程

2010-02-06 09:45:49

Android屬性

2012-10-25 13:57:46

2023-09-28 08:51:58

Java數(shù)據(jù)

2009-11-06 11:10:01

2010-01-27 15:50:23

C++復雜性

2012-04-12 11:28:04

2009-09-23 09:19:23

點贊
收藏

51CTO技術棧公眾號