關於假設---看不見的基石(invisible foundation stone)
1序我們現在的大多數基礎理論都是建立在一些簡單而明顯的假設之上的。
例如在數學領域,在物理學領域,在化學領域
同時也有一些基礎理論因為假設的錯誤或者不夠準確,而被新的理論所代替,或者被擴充套件和修改。
例如「第五公設問題」?
2展開在漏洞研究中,我們發現:程式的編寫和執行都基於一定的假設,如果這些假設與實際狀況不匹配,就
會出現錯誤或紕漏;如果這些假設是安全相關的,那麼一旦不匹配就會出現漏洞。
eg.void chartoint(char *p)
int i = atoi(p);
void chartoint(char *p)
if(!p) return;
int i = atoi(p);
如果 *p="1234"; 該程式段正常執行
如果 *p="egxr"; 還能正常執行嗎?
也就是:程式設計師在編寫程式時,想當然的認為傳進的引數應該是「1234」樣式的,然而如果引數樣式
不是這樣哪?例如,字串超長,或者字串為字母串。
3思考1在實際應用中,這些假設都是不可見的,如何將這些假設可見?
2如何利用這些假設來維繫程式的安全性或者驗證程式的安全性?
3如何驗證假設與實際狀況的不匹配?
可以做的工作:
1將假設分類
第一種假設涉及到由程式語言和作業系統提供的基元在執行時的正確性;
第二種假設難以用表示,但是在執行時可以評估。這種假設無法判斷,幾乎沒有乙個演算法將
環境例項作為輸入引數,以檢驗是否在整個執行期間假設保持不變,因為這種假設太主觀了;
第三種假設是可以用決定演算法表示的,此時的環境物件是程式語言可用的資料型別。
[from krsul]
還可以分為兩類,一類程式語言可表示的,可以用程式來驗證假設是否一直保持;
另一類是,程式語言無法表示,但是編譯器和直譯器可以做到。
2對假設的描述,可以用類c語言
4延伸是否可以由這種思想出發,做程式安全性驗證?
這種假設的思想,其實是在外部考慮的,程式的(全域性)系統環境,程式的(區域性)配置環境,程式
的輸入環境,還有程式的邏輯環境
這樣就對應著一系列假設,某個程式應該在什麼樣的系統環境、什麼樣的配置環境、什麼樣的輸入
環境以及什麼樣的邏輯環境下工作?
其實這些假設是程式設計師或者架構師預設的(default),並沒有具體的體現,當然一些資深的程式設計師或者
架構師會考慮假設的問題,在某些地方會做驗證或者檢測,但是這種工作很不全面,或者是沒有完全
將其作為乙個很突出的問題來考慮。
「看不見的手」
150年前,隱秘的歐洲金融權貴羅斯切爾德家族保留著一句名言 絕大多數的人民在智力上不足以理解這個系統 支票貨幣和信用貨幣 以及這個系統所衍生出的資本和巨大優勢,他們將承受壓迫而毫無怨言,甚至一點都不會懷疑這個系統損害了他們的利益。多年之後,羅斯切爾德家族的子孫,幾乎控制了所有發達國家的貨幣發行權,掌...
看不見的競爭 頻寬優化
看不見的競爭 檔案和資料壓縮 看不見的競爭 把握意見領袖 對於有創業經驗的人而言,這甚至都不能稱之為問題。但必須指出,其實很多創業新人,會忽略這個問題。很多人會簡單的認為,我找乙個靠譜的託管方,把我的內容放上去,就可以了,其實,問題真的沒那麼簡單。不說別人,我自己都交過學費。很久以前,電信網通分家的...
C 中看不見的臨時物件
物件導向的程式語言中涉及到物件的建立與銷毀,其中有建構函式與析構函式的呼叫,在建立物件 值拷貝物件等過程中,編譯器會隱含建立一些原始碼中沒有的臨時物件,如果不注意,這些臨時物件會給程式的效能帶來很大的影響。下面介紹二種常見的臨時物件產生環境並給出解決方案 1 當函式返回乙個物件時,一般情況下會出現臨...