首先,我希望这个问题不要太开放。作为用于编码标准/策略、库/API 比较等的成分。我希望为形容词“库安全”建立一个正式的或至少半正式的定义。为了不将我自己的观点或其他任意观点强加于最佳实践作为定义的一部分,我想避免过于严格的定义。作为我的意思的一个例子,将任何访问静态存储持续时间的非 const 限定对象或更改其他进程全局状态(例如信号处置)的代码视为库不安全的可能是一个工作定义,但是它比它需要的要严格得多。
我希望捕获的基本属性是:
能够在同一进程中拥有库代码的多个“用户”,无论这意味着使用库代码的同一代码的多个实例(递归或线程),还是使用库代码完全分离程序的部分,没有这些用户踩着对方的脚趾。
不修改“属于”调用者的状态,除非接口合同中记录。
我认为对这个问题有好处的答案类型是参考过去类似的定义这个概念的尝试,将定义放在一起的强烈想法,或者令人信服的论点,即试图精确定义这个概念是徒劳的。
顺便说一句,我标记了这个 C、C++ 和 POSIX,因为这些是我最感兴趣的应用这种定义的上下文。在其他语言的上下文中它可能不那么有趣;例如,在一种非常纯粹的函数式语言中,所有代码可能都应该被认为是“库安全的”。
建议的定义:
如果存在程序 A 和 B,则库 L 是库不安全的:
- A 和 B 不接受任何输入。
- A 和 B 除了退出状态外不产生任何输出。
- A 和 B 不会调用未定义的行为。
- A 和 B 不包含 L 之外的任何更改全局状态的代码。
- 将 A 和 B 组合到一个程序中,必要时重命名 L 之外的函数或对象以避免冲突,这样 A 和 B 的主要函数都在各自的线程中运行,导致程序调用未定义的行为或输出不同从分别运行 A 和 B 的输出。