导致无限递归循环的检测代码
Instrumented code causing infinite recursion loop
在以下情况下如何防止疑似无限循环?
- 整个 C++ 代码库在构建时由 clang 进行检测,使用 LLVM pass 搜索
llvm.memcpy
内在函数并插入 post-调用检测 运行time
- 检测 运行time 包含一个
std::map
结构
- 实现
std::map
的底层 libc++ 代码已被检测,并依次调用检测 运行time again
当我 运行 程序时,它会在第一次检测调用后冻结。疑似循环是trace_memcpy
>std::map::operator[]
>trace_memcpy
>等等
有没有办法使这个回路短路,例如检测库是否可以检查调用堆栈以查看它已经 在 调用堆栈中并且 return 早于 trace_memcpy
函数?
谢谢:)
快速且肮脏且可能不是防弹的 - 在 trace_memcpy
的实现中添加一个 static
变量以避免嵌套。
void trace_memcpy(void)
{
static int nested;
if (nested)
{
return;
}
nested = 1;
// whatever your actual trace logic is
nested = 0;
}
如果您需要更复杂的东西,请使用系统提供的适当的并发对象。
在以下情况下如何防止疑似无限循环?
- 整个 C++ 代码库在构建时由 clang 进行检测,使用 LLVM pass 搜索
llvm.memcpy
内在函数并插入 post-调用检测 运行time - 检测 运行time 包含一个
std::map
结构 - 实现
std::map
的底层 libc++ 代码已被检测,并依次调用检测 运行time again
当我 运行 程序时,它会在第一次检测调用后冻结。疑似循环是trace_memcpy
>std::map::operator[]
>trace_memcpy
>等等
有没有办法使这个回路短路,例如检测库是否可以检查调用堆栈以查看它已经 在 调用堆栈中并且 return 早于 trace_memcpy
函数?
谢谢:)
快速且肮脏且可能不是防弹的 - 在 trace_memcpy
的实现中添加一个 static
变量以避免嵌套。
void trace_memcpy(void)
{
static int nested;
if (nested)
{
return;
}
nested = 1;
// whatever your actual trace logic is
nested = 0;
}
如果您需要更复杂的东西,请使用系统提供的适当的并发对象。