C++更改函数参数时怀疑存在堆栈溢出

C++ Suspected stack overflow changing function parameters

本文关键字:怀疑 存在 堆栈 栈溢出 参数 函数 C++      更新时间:2023-10-16

我正在Linux系统上使用setcontext()makecontext()getcontext()swapcontext()在C++中实现一个用户级线程库。

我使用包装器函数来包装用户想要作为线程运行的函数。例如,用户调用newthread(funcPtr),并且在线程库中funcPtr被传递给运行它的包装器函数

根据我是否在函数中启动未使用的字符串,错误的发生方式不同。如果我包含行string s = "a";,程序将运行到完成,但gdb显示上下文正在切换到字符串库中的某个位置。如果没有这一行,程序将在离开函数包装器后segfault。

gdb输出显示function()的参数损坏。

我运行了valgrind,但在输出中没有看到任何特别的异常,只有许多"大小为4的无效读取"answers"大小为四的无效写入"警告,通常在C++标准map中。

您也可以尝试AddressSanitizer进行调试。它可以检测堆栈缓冲区溢出。以下是如何在Linux上使用它:

AddressSanitizer至少需要gcc 4.8,并且必须安装libasan(例如,在Fedora yum install libasan上作为root用户)。编译并与-g -fsanitize=address链接,运行生成的可执行文件。AddressSanitizer在检测到第一个错误时停止并发出信息,无需分析长日志文件。解决报告的问题,编译并再次运行,直到AddressSanitizer不再停止程序。不幸的是,可能存在误报,因为您在程序中使用了swapcontext,但值得一试。可以通过添加属性no_sanise_address:extern int func(void) __attribute__((no_sanitize_address)); 来关闭特定函数的检测