我正在开发一个大型嵌入式系统(Windows上的STM32 F423 CPU和CubeIDE环境,所有代码都是C),最近我发现一定是某个地方缓冲区溢出了。mbedtls库报告了一个错误,表明服务器没有在要求的时间内响应。问题是,当我注解我最近添加的一个函数时(完全不相关,甚至在错误发生前都没有执行),一切都运行正常,我认为函数的存在导致内存排列发生偏移,其他一些代码有缓冲区溢出bug,它覆盖了mbedtls库中的某个变量。然后Mbedtls向服务器发送一些无效数据,服务器没有响应。这是我的猜测。
我尝试将mbedtls更新到最新版本。我还尝试通过以下方法查找有问题的指针操作:
- 添加各种编译器标志:第一个月第一个月,第一个月第一个月,第一个月第二个月,第一个月第三个月
-fbounds-check
-这看起来没有任何作用,因为编译后的代码有和没有它的大小是一样的,- 向大多数采用指针参数的函数添加访问属性,
- 将
-fsanitize=address
添加到编译器选项中。
最后一件事是有问题的,因为它会触发编译器错误:
arm-none-eabi-gcc: fatal error: cannot read spec file 'libsanitizer.spec': No such file or directory
您知道如何在CubeIDE工具链的GCC中添加杀毒软件支持吗?
我也得到了一个使用git bisect的建议,我还打算尝试一下,虽然我的希望并不高,因为很可能这个bug很久以前就被引入了,而引入它的版本也会工作得很好,因为不同的内存安排。
此外,有消毒剂将有助于找到其他指针问题,我可能有和不知道。
1条答案
按热度按时间vwoqyblh1#
虽然GCC的AddressSanitizer文档将ARM列为支持的平台,但它仅适用于Android。
要添加支持,您需要移植一个ASAN运行时库(如Android、GCC或LLVM库)并定义.spec文件。整个过程超出了SO的范围,但可能会出现的具体问题可能是主题。