我使用atollic 8.1附带的newlib(standart,而不是newlib nano)。
目前,各种XXXprintf版本都破坏了我的堆栈,我不明白为什么。
我添加了3张图片来显示问题:
用例1
在图像3.png中,您看到的是写成max的vsprintf(rt_vsnprintf ist只是一个宏正向的宏)。 1024到“ sBuf.printf_buffer”,它的长度为1024个字节,位于0x20001c08(到0x20002008)。
通过这样做,newlib printf函数将覆盖我的至少一个位于0x20006014的变量,因此它不仅有点溢出,而且还很正常。...
我用sprintf,snprintf,vsnprintf,vsprintf进行了测试。所有这些函数都写在我的变量中。
有人知道这种行为如何发生吗?
答案 0 :(得分:0)
printf函数需要大量的堆栈空间。您的堆栈有多大?它在哪里?它靠近地址0x20006014的canary变量吗?您可以尝试将堆栈增大2 kB,看看是否有区别吗?