【问题标题】:Ada: Check if OUT parameters have changed (from NULL) after procedure callAda:在过程调用后检查 OUT 参数是否已更改(从 NULL)
【发布时间】:2018-11-05 13:55:36
【问题描述】:

给定一个包含多个不同类型的 OUT 参数的过程,全部初始化为 null,我如何在过程调用后检查它们的 值是否变化?即如果他们不再是null


我认为可能有比串接if (OUTP_1 /= null) and (OUTP_2 /= null) ... then ALL_FINE := TRUE; 更好的方法。

有一个易于应用的解决方案会很棒,因为我实际上有 许多 程序可以检查这一点。不寻求优雅,而是易于实施。

【问题讨论】:

    标签: parameters null ada out


    【解决方案1】:

    Ada 将 OUT 参数视为未初始化。如果他们没有在过程中被分配一个值,他们的值是不可信的。

    您可以对程序运行 SPARK 分析。 SPARK 分析器会将未设置的 OUT 参数识别为未初始化的变量。

    或者,如果您使用的是 Ada 2012,您可以为每个过程定义后置条件。如果使用 Ada 的早期版本,您可以使用 PRAGMA ASSERT 创建类似的后置条件。

    在调用过程之前将参数设置为 NULL 对 OUT 参数没有影响。您似乎将 OUT 参数与 IN OUT 参数混淆了。

    【讨论】:

    • 关于 SPARK 分析的任何指针或教程?我正在使用 Ada 95,那么您能否通过 PRAGMA ASSERT 扩展后置条件的创建?如果给 OUT 参数赋值对它没有影响,它会引发编译器错误还是保持沉默?
    • 为 OUT 参数赋值确实会对参数产生影响。 OUT 参数值被视为未初始化,直到您为参数赋值。为 Ada 2005 添加了 Pragma Assert。有什么方法可以使用该语言的更现代版本? SPARK 也很难用 Ada 95。
    • 您是否在这方面尝试过您的编译器?我运行的一个小测试表明,即使在执行过程中没有分配任何值,OUT 参数的值也可能会从初始化值发生变化。这并不完全令人惊讶,因为 OUT 参数被过程视为未初始化。仅检查 NOT NULL 不足以确定该值是否已在过程中分配。
    • 如果希望能够保证保留NULL值作为初始值,需要将参数调用方式改为IN OUT,如果处理legacy也可能会出现问题代码。
    • 您必须进行危害分析以确定可能存在的危害。可能会出什么问题,不当行为的影响是什么? OUT 和 IN OUT 参数都会产生副作用。只有 IN OUT 参数会将副作用带入您正在测试的过程中,并且仅当过程在更改之前读取 IN OUT 值时,这些副作用才重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2010-10-01
    • 2012-06-07
    • 2013-06-14
    相关资源
    最近更新 更多