微軟開源了一個(gè)名叫Checked C的研究項(xiàng)目,該項(xiàng)目為C語言加入了新的語法。項(xiàng)目的主要目標(biāo)是為了抵消使用C語言編程帶來的一些危險(xiǎn),比如造成Heartbleed和Shellshock安全事故的bug。 這在理論上一個(gè)大膽的想法。這個(gè)想法中最困難的地方是怎樣促使C語言開發(fā)者修改現(xiàn)有代碼,修改遺留C代碼通常會(huì)是非常困難的。 在受傷前先檢查一下自己Checked C是C語言的修改版,重點(diǎn)針對(duì)指引引起的問題。C語言中可以直接訪問內(nèi)存。新版C語言提供了幾種新的指針和數(shù)組類型,自帶安全檢查。它們與C語言現(xiàn)有的非安全指針不同,程序員可以使用新的帶安全檢查的指針。當(dāng)然,如果有需要也可以切換回非安全類型的指針。 新版本還提供了帶檢查的程序作用域。這些程序代碼段默認(rèn)啟用邊界檢查。如果程序員試圖在這樣的代碼段中使用非受檢指針,編譯器會(huì)拒絕編譯。當(dāng)然,也可以使用 目前已經(jīng)有一些工具可以對(duì)C語言進(jìn)行安全分析和檢測(cè),比如Cppcheck。但是它們通常都是獨(dú)立的靜態(tài)代碼分析工具。Checked C在程序構(gòu)思和計(jì)劃時(shí)就直接將安全特性加入了C語言。 前方的障礙盡管Checked C聽起來野心勃勃并且非常有價(jià)值,但是它也面臨著改變現(xiàn)有都會(huì)遇到的兩個(gè)巨大挑戰(zhàn)。首先,這種變化是否向后兼容。其次,這些變化通常會(huì)對(duì)現(xiàn)有的工具鏈產(chǎn)生顛覆性的影響。這兩個(gè)問題都會(huì)影響新語言能否被接受。 微軟至少部分實(shí)現(xiàn)了向后兼容。引入到Checked C中的變化并沒有讓現(xiàn)有的C代碼失效,它們?nèi)匀豢梢韵褚郧耙粯泳幾g。所有的新語法和對(duì)語言的變更都可以與遺留代碼共存。 已有的C程序甚至不需要立刻轉(zhuǎn)換為Checked C,可以逐文件或逐函數(shù)進(jìn)行轉(zhuǎn)換。微軟還聲稱,新風(fēng)格的受檢構(gòu)造器“與現(xiàn)有的指針和數(shù)據(jù)類型完全布局兼容”。這種向后與向前的高度兼容性為Checked C提供了優(yōu)勢(shì)。但即使如此Checked C也不會(huì)自動(dòng)勝出,它需要變得通用。 這就引發(fā)了另一個(gè)問題,變化對(duì)工具鏈產(chǎn)生的影響。考慮到這個(gè)問題,微軟從被廣泛使用的著名編譯器框架LLVM上建立了分支。因此,如果Checked C有足夠的吸引力,那么被LLVM項(xiàng)目采納會(huì)更加容易。 據(jù)說微軟之所以選擇LLVM,是由于它遵循寬松的許可并且設(shè)計(jì)目標(biāo)就是針對(duì)新的編程語言,而不是將LLVM作為Checked C推廣的工具。要獲得更廣泛的接受,Checked C必須讓更古老的GCC編譯器對(duì)其提供支持。(更不用說在微軟自己的Visual Studio中支持Checked C了) Mozilla的Rust語言已經(jīng)被作為可以寫出比C語言更加安全的程序。Rust語言已經(jīng)取得了巨大的開發(fā)進(jìn)展并且獲得了廣大的使用者。但Rust還年輕,而C語言已經(jīng)被廣泛使用并且根深蒂固。假設(shè)Rust最終沒有提供Checked C期望實(shí)現(xiàn)的那些功能,那么修改已有的C程序代價(jià)可能會(huì)比用Rust重寫要小。
|
|