【问题标题】:What is a runtime-constraint?什么是运行时约束?
【发布时间】:2020-04-30 08:11:06
【问题描述】:

我多次听说过“运行时约束”这个术语。我一直在实际标准 ISO/IEC 9899:2018 (C18) 中寻找“运行时约束”一词,但我发现的只是:

来源:ISO/IEC 9899:2018 (C18),第 3.18 节:

3.18

1 运行时约束

调用库函数时对程序的要求。

我不明白,这句话要表达什么。哪个要求?我比以前明白了。

这里没有以任何方式描述“要求”本身。只是强调,调用库函数时引用的需求应该是存在的,而不是这个需求究竟是什么。

这里的“程序”到底是什么意思?

这是否意味着,运行时约束是对可执行文件的要求如何调用库函数?但是为什么可执行文件要调用库函数呢?我的观点是可执行文件只是机器代码,需要执行。


  • 什么是 C 中的运行时约束?

【问题讨论】:

  • 附件 K 中描述的可选边界检查接口记录了运行时约束。
  • 运行时约束适用于程序的执行。如注 1 所述,运行时约束不需要在翻译时进行诊断。如注释 2 所述,附件 K 中的函数需要验证它们指定的运行时约束没有被违反。

标签: c function runtime terminology function-call


【解决方案1】:

这是在运行时检查非法或缺失值 - 实际的约束检查取决于被调用的特定库函数。例如,

K.3.5.1.1 tmpfile_s 函数

剧情简介

1 #define _ _STDC_WANT_LIB_EXT1_ _ 1 #include <stdio.h> errno_t tmpfile_s(FILE * restrict * restrict streamptr);

运行时约束

2 streamptr 不得为空指针。

IOW,如果您将NULL 传递给streamptr,则违反运行时约束,这会导致调用约束处理函数(您可以编写自己的约束处理函数)。如果这有助于将其可视化,它是一种但不是真正的异常处理程序。

每个库函数都定义了自己的要求,因此每个函数都有自己的运行时约束检查。

编辑

正如 Jonathan Leffler 在 cmets 中指出的那样,运行时约束仅适用于附件 K 中指定的边界检查库函数,并且这些库函数是可选的——并非每个实现都支持它们。事实上,C 标准委员会文件n1967 表明没有实现完全支持它们,C11 和 C18 附录 K 中指定的功能可能会从 C 标准的未来版本中删除。

【讨论】:

  • 您可能还注意到,运行时约束仅为附件 K 中的函数明确指定,这是标准的可选部分。之前唯一提到的运行时约束在 §3.18 定义中。 C11 §7.1.4 Use of library functions 中有一套通用的函数使用规则,各个函数可以覆盖特定的规则。
  • @JonathanLeffler Annex K 是关键元素,它提供了我所缺少的基本原理。以我的拙见,这句话应修改为“调用库函数时要求程序在附件K中指定”以避免发生在我身上的混淆。附录 K 还更清楚地解释了运行时约束的上下文。
  • @RobertS-ReinstateMonica — 我认为,该定义更有可能与附件 K 一起被删除。
  • @JonathanLeffler 是的,我同意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
相关资源
最近更新 更多