gpt4 book ai didi

c++ - 检测单元测试中的特定函数调用

转载 作者:IT王子 更新时间:2023-10-29 00:21:05 25 4
gpt4 key购买 nike

我希望能够检测我的函数(或它调用的任何其他函数)是否最终会调用某些特定函数(例如,mallocfree ) 在我的单元测试中:我的软件的一些小部分有硬实时要求,我想确保没有人添加会在这些函数中意外触发分配的东西(并让我的 CI 管道检查它自动)。

我知道我可以在 gdb 上放置一个断点,但理想情况下我想做类似的事情:

void my_unit_test() {
my_object obj; // perform some initialization that will allocate

START_CHECKING_FUNCTION(malloc); // also, operator new or std::allocate would be nice
obj.perform_realtime_stuff();
STOP_CHECKING_FUNCTION(malloc);
}

理想情况下,如果在两次检查之间调用 malloc,测试将以不太脏的方式失败(例如,不是 std::abort)。

理想情况下,这可以在任何系统上运行,但我现在可以接受只在 linux 上运行的东西。这在某种程度上可能吗?也许通过 LD_PRELOAD hack 来替换 malloc,但我宁愿不必为我感兴趣的所有函数都这样做。

最佳答案

单元测试调用它们测试的函数。您想知道单元测试调用的函数 F 是否最终可以调用 malloc(或 new 或 ...)。看起来你真正想做的是为你的整个系统构建一个调用图,然后在调用图中询问关键函数 F 是否 F 可以到达 malloc 等。一旦您有了调用图,这就很容易计算了。

获取调用图并不是那么容易。如果您有一个进行名称解析的真实语言前端,那么发现模块 A 直接调用模块 B “在技术上很容易”。找出 A 间接调用的内容并不容易;您需要一个(函数指针)指向分析,而这些很难。当然,您已经决定是否要深入研究库(例如 std::) 例程。

面对函数指针和方法调用,您的调用图需要保守(这样您就不会错过潜在的调用)并且相当精确(这样您就不会淹没在误报中)。

此 Doxygen 支持声称构建调用图:http://clang.llvm.org/doxygen/CallGraph_8cpp.html我不知道它是否处理间接/方法调用或者它有多精确;我不是很熟悉它,文档看起来很薄。过去的 Doxygen 并没有很好地处理间接寻址或精确的声誉,但过去的版本并不是基于 Clang 的。在 http://stackoverflow.com/questions/5373714/generate-calling-graph-for-c-code 上有一些关于小规模应用的进一步讨论。

你的问题被标记为 c/c++ 但似乎是关于 C++ 的。对于 C,我们的 DMS Software Reengineering Toolkit凭借其通用流分析和调用图生成支持,再加上 DMS 的 C Front End , 已经习惯了 analyze C systems of some 16 million lines/50,000 functions with indirect calls生成保守正确的调用图。

我们没有专门尝试为大型系统构建 C++ 调用图,但与 DMS 的 C++ Front End 一起使用时,相同的 DMS 通用流分析和调用图生成在“技术上很简单”。 .在构建正确且大规模运行的静态分析时,没有什么是微不足道的。

关于c++ - 检测单元测试中的特定函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48044674/

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