c++ - 定义 "library-safe"代码的概念

标签 c++ c language-agnostic posix libraries

关闭。这个问题是off-topic .它目前不接受答案。












想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。

8 年前关闭。




Improve this question




首先,我希望这个问题不要太开放。作为用于编码标准/策略、库/API 比较等的成分。我希望为形容词“库安全”建立正式或至少半正式的定义。为了不将我自己的观点或其他武断的最佳实践观点强加于定义中,我想避免过度限制性的定义。作为我的意思的一个例子,认为任何访问静态存储持续时间的非const限定对象或改变其他进程全局状态(例如信号处置)的代码是库不安全的可能是一个工作定义,但是它比它需要的要严格得多。

我希望捕获的基本属性是:

  • 能够在同一进程中拥有库代码的多个“用户”,无论这意味着使用库代码的同一代码的多个实例(递归或线程),还是使用库代码的程序的完全独立部分,没有这些用户踩在彼此的脚趾上。
  • 不修改“属于”调用者的状态,除非在接口(interface)契约(Contract)中记录。

  • 我认为对这个问题有益的答案类型将是对过去定义这个概念的类似尝试的引用,将定义放在一起的强有力的想法,或者令人信服的论点,即试图精确地定义这个概念是徒劳的。

    顺便说一下,我已经标记了这个 C、C++ 和 POSIX,因为这些是我最有兴趣应用这样一个定义的上下文。在其他语言的上下文中它可能不太有趣;例如,在非常纯的函数式语言中,所有代码都应该被认为是“库安全的”。

    提议的定义:

    如果存在程序 A 和 B 使得库 L 是库不安全的:
  • A 和 B 不接受任何输入。
  • A 和 B 除退出状态外不产生任何输出。
  • A 和 B 不会调用未定义的行为。
  • A 和 B 在 L 之外不包含任何改变全局状态的代码。
  • 将 A 和 B 组合成一个程序,必要时重命名 L 之外的函数或对象以避免冲突,这样 A 和 B 的主要函数都在自己的线程中运行,导致程序调用未定义的行为或输出不同从分别运行 A 和 B 的输出。
  • 最佳答案

    我同意您不访问非常量限定的全局状态的标准可能过于严格。特别是库中的 C 代码修改 errno 可能是完全合理的。让更高级别的代码知道为什么会发生故障。

    许多要求(无论如何我会看到它们)可能比代码本身更适用于文档。修改 errno很好,但肯定需要记录。

    对于 C++ 代码,异常安全有点类似。显然,您希望大多数代码能够(合理地)提供最强大的异常安全性,但是所提供的确切级别远不如它所提供内容的文档重要。

    关于c++ - 定义 "library-safe"代码的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16258901/

    相关文章:

    c - 如何使用 TCP/IP 协议(protocol)从 Android 接收文本文件到 C。我有数据丢失

    c - 令人难以置信的程序崩溃调用堆栈

    c++ - 两组函数如何互斥?

    c++ - cin 到 C++ 中的 vector

    c - 在没有 SDL_INIT_VIDEO 的情况下使用 SDL_INIT_JOYSTICK

    algorithm - 地理空间查询

    regex - 删除 IntelliJ 中文本周围的引号(使用正则表达式?)

    language-agnostic - 用于编程的首选键盘布局

    c++ - 代码 :Blocks Mingw Compiler Error: Variable-Sized Object May Not Be Initialized

    C++地址之间的区别