gpt4 book ai didi

c++ - 如何检测 C++ 中的 API 中断

转载 作者:行者123 更新时间:2023-11-30 00:48:04 25 4
gpt4 key购买 nike

如何检测 C++ 中不兼容的 API 更改? (不是 ABI,而是 API 更改)

兼容的更改是不能破坏使用 API 的代码编译的地方,例如:

  • 使用默认参数添加到方法的参数
  • 添加到类中的方法
  • 加入类(class)的成员
  • 已添加的类(class)
  • 成员或方法的顺序发生了变化
  • 评论/文档更改

不兼容的更改可能会破坏使用 API 的代码编译,例如:

  • 删除了参数、(公共(public)/ protected )方法、成员、类
  • 输入参数或成员的变化
  • 公共(public)/ protected 成员或方法的名称更改
  • 类从一个标题移到另一个标题

最佳答案

OP 认为 C++ 解析可能是必要的是正确的。也可能是深层推理。

我认为提出问题的方式是,

对于现有应用程序中 API 的一组特定用途,更改 API 会改变应用程序还是破坏应用程序?

如果您不将自己局限于一组特定的用途,几乎对 API 的任何更改都会改变其语义。否则,你为什么要制作它们(模重构?)。如果您在应用程序中使用全套 API 功能,那么它的语义也必须以某种方式改变。

一组特定的用途,可以确定 API 的哪些属性可能会影响特定的用途,并确定它们是否确实如此。最终,您必须准确地 解析原始代码,以确定特定的用途集以及使用它们的上下文。您还必须确定现有应用程序所依赖的语义属性,包括旧版 API 提供的属性。最后,您需要确定新 API 定义的属性,并验证是否仍然支持应用程序的需要。

一般来说,您需要一个针对程序属性的定理证明器来检查这一点。而且,虽然定理证明技术在过去 50 年中取得了显着进步,但 AFAIK 表示,技术还不够强大,无法采用普遍任意的程序属性并证明它们,更不用说克服对任意复杂程序进行推理的问题了。

考虑:

 // my application
int x=0;
int y=foo(x); // API ensures that fail...
if (y>3) then fail(); // shouldn't happen
exit();

// my legacy API
int foo(int x) { return x+1; }

现在假设 API 更改为:

 // my new API
int foo(int x) { return x+2; }

应用程序仍然正常运行。怎么样:

 // my new API
int foo(int x) { return TuringMachine(x); }

我们如何证明 TuringMachine(x) 产生的值 < 3?如果我们不能为这么小的程序做到这一点,我们将如何去做对于我们在实践中写的那些?

现在,您可以将要考虑的更改集限制为简单的“语法”操作,例如“移动方法”、“添加具有初始值的参数”等。

您仍然需要解析原始程序和修改后的 API,并检查句法属性暗示的语义属性是否不会损坏原始程序。您可能需要控制和数据流分析、别名分析来担心指针等,并且该工具最多只能在有限数量的情况下判断没有发生变化。

我确信有关于这个主题的研究论文。快速查看 scholar.google.com 没有发现任何明显的问题。

关于c++ - 如何检测 C++ 中的 API 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32957494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com