C++更改函数参数时怀疑存在堆栈溢出
C++ Suspected stack overflow changing function parameters
我正在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));
来关闭特定函数的检测
- C++模板来检查友元函数的存在
- 既然存在危险,为什么项目要使用-I include开关
- 我们可以访问一个不存在的联盟的成员吗
- C++:对不存在的命名空间使用命名空间指令
- C++quit()函数中可能存在作用域问题
- C++擦除(如果存在)
- g++ 说函数不存在,即使包含正确的标头
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 有了gcc,是否可以链接库,但前提是它存在
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- C++Builder中的OnClick事件签名存在问题
- 如何正确地将分支添加到已存在的树中
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 如何检查QList中是否存在值
- 根据某个函数是否存在启用模板
- 如何将分支添加到已存在的TTree:ROOT
- 地图计数确实很重要,或者只是检查是否存在
- 通用C++/Python 多语言的存在
- C++更改函数参数时怀疑存在堆栈溢出