WCH risc-v mcu ch32v307 返回栈指针为什么是0?

详情

https://www.zhihu.com/question/7233096076

您好,根据您的代码,不建议将函数内部临时变量的地址作为返回值。函数调用结束后栈空间释放,局部变量的地址为无效值。
编译时会出现警告提醒。image.png



@TECH224 我不是来讨论栈上数据是不是有效的, 我知道怎么用.


@TECH224 其次, 栈即使释放了, 但是函数返回值在寄存器, 怎么会是 0


TECH224 而且这代码在 msvc 和 armcc 表现都是一样的, 都能正常返回啊


您好,涉及到函数栈地址的返回时,编译器通常会做出一定的优化决策,以避免其潜在风险。

不同的编译器会有不同的处理。可能是不作处理直接返回无效地址,或为避免程序访问非法内存而返回0值。 

在函数test1中,返回ret时,将地址通过寄存器返回;在函数test中,GCC对于直接返回&a的情况进行处理,以0作为返回值,避免返回已经被销毁内存的地址。 在这种情况下,直接返回 0是一个保护措施,防止程序访问非法内存。 

image.png


您好,如还有其他问题,可以联系邮箱lhb@wch.cn,方便进一步交流。


多谢回复, 这个跟优化等级有关系吗? 我目前只遇到过 risc-v 的 gcc 出现过这种优化, 我编译参数是 -O0.  

这种所谓优化或者保护有编译选项可以关闭吗? 因为调试在内存中加载的机器码用主程序的调试器没法调试

如果用邮箱联系的话, 需要重新把问题整理后发邮件是吧


TECH224

我用 STM32 的 CubeIDE 带的 gcc 编译器也测试了下, 发现的确和 MounRiver Studio_Community 的 gcc 编译器一样, 看来应该是 gcc 的行为, 就是不知道有没有哪个参数可以关闭这种行为


您好,该行为应该是与优化等级无关的,在O0和Os下是同样的情况。
使用GCC12,将函数返回值类型定义为整型时,能直接返回局部变量地址;当函数返回值类型定义为指针类型时则返回0。您可据此进行相应处理。
后续如仍有相关问题,可以直接将本帖链接发送至邮箱
lhb@wch.cn,方便通过邮箱更好地沟通。


只有登录才能回复,可以选择微信账号登录