【问题标题】:`global` assertions?`全局`断言?
【发布时间】:2011-04-09 10:42:45
【问题描述】:

是否有任何语言可以声明global 断言——即在整个程序执行期间应该保持的断言。这样就可以编写如下内容:

global assert (-10 < speed < 10);

并且每次speed 更改状态时都会检查此断言?

【问题讨论】:

    标签: validation assert verification assertions


    【解决方案1】:

    eiffel 支持所有不同的合同:前置条件、后置条件、不变量……您可能想要使用它。

    另一方面,为什么你有一个全局变量?你为什么不创建一个修改速度的类。这样做,您可以在每次值更改时轻松检查您的状况。

    【讨论】:

      【解决方案2】:

      我不知道有任何语言真正做这样的事情,我怀疑是否存在任何语言,因为它是相当难以实现的东西,同时又不是什么东西很多人都需要。
      通常最好简单地断言输入是有效的,并且仅在允许时以定义的、理智的方式进行修改。这就结束了对“全局断言”的需求。

      您可以通过多种方式“通过后门”获得这种效果,但没有一种是真正优雅的,其中两种方式相当依赖于系统:

      • 如果您的语言允许运算符重载(例如 C++),您可以创建一个类来重载任何修改值的运算符。在其中进行断言是一项相当大的工作,但另一方面也是微不足道的。
      • 在几乎每个系统上,您都可以更改对属于您的进程的内存页的保护。您可以单独放置变量(以及您想要断言的任何其他变量)并将页面设置为只读。这将在写入值时导致分段错误,您可以捕获(并验证断言是否为真)。 Windows 甚至通过“保护页面”(实际上只是“伪装的只读页面”)明确地提供了这一点。
      • 大多数现代处理器都支持硬件断点。除非您的程序要在某个非常奇特的平台上运行,否则您可以利用这些来获得更细粒度的控制,就像篡改保护一样。例如,参见另一个站点上的this article,它描述了如何在 x86 上的 Windows 下执行此操作。此解决方案将要求您编写一种“迷你调试器”,并暗示您在真正的调试器下运行程序时可能会遇到麻烦。

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-16
        • 2018-07-03
        • 2021-06-03
        相关资源
        最近更新 更多