2011-04-09 57 views
0

是否有任何語言可以聲明global斷言 - 這是在整個程序執行過程中應該保持的斷言。因此,這將是可能寫出類似:`全局`斷言?

global assert (-10 < speed < 10); 

和這一說法將被檢查每次speed變化狀態?

回答

-1

我不知道任何語言,真的做這樣的事情,我會懷疑,有任何語言,因爲它是很難實現的東西,同時不是很多的東西人們需要。
簡單地斷言輸入是有效的,修改只能在允許的情況下進行,並且採用定義的,理智的方式。這就結束了「全球斷言」的需要。

你可以得到這樣的效果「通過後門」在幾個方面,但沒有一個真正優雅,另外兩個是相當依賴於系統的:

  • 如果你的語言允許運算符重載(諸如C++) ,你可以創建一個類來重載任何修改該值的操作符。這是相當大的工作,但另一方面,微不足道的是,在那裏做斷言。
  • 在幾乎所有系統上,都可以更改屬於您的進程的內存頁的保護。您可以分別放置變量(和任何其他想要聲明的變量),並將頁面設置爲只讀。這會在寫入值時導致分段錯誤,您可以捕獲該錯誤(並驗證斷言是否爲真)。 Windows甚至通過「保護頁面」(這實際上只是「僞裝的只讀頁面」)使其明確可用。
  • 大多數現代處理器都支持硬件斷點。除非您的程序要在某個非常奇特的平臺上運行,否則您可以利用這些程序以類似的方式進行更細粒度的控制,例如通過篡改保護。在另一個網站上查看例如this article,其中描述瞭如何在x86上的Windows下執行此操作。該解決方案將要求您編寫一種「小型調試器」,並暗示在實際調試器下運行程序時可能會遇到麻煩。
1

艾菲爾支持所有不同的契約:先決條件,後置條件,不變......你可能想要使用它。

另一方面,爲什麼你有一個全局變量?你爲什麼不創建一個修改速度的類。這樣做,每當價值發生變化時,您都可以輕鬆檢查您的狀況。