zhangzhonghua 发表于 2023-12-26 19:06:28

遇到局部变量被意外修改的问题,发现是编译器给2个局部变量分配了相同的地址?

本帖最后由 zhangzhonghua 于 2023-12-27 16:33 编辑

遇到局部变量被意外修改的问题,仿真,单步跟踪,发现是编译器给2个具有调用关系的函数的2个局部变量分配了相同的地址,这怎么回事?
简化如下。
func1()
{
xInfo * p = ...;    // 局部变量,指向某结构xInfo的指针,地址 0x0236
   ...
func2();
                  // 到这里,发现 地址 0x0236 的内容被修改
}

func2()
{
uchar sw;   // 局部变量,地址居然也是 0x0236
sw = 0;      // 这里,就会把func1的局部变量p给意外修改了
}
怎么会这样?!怎么办?

rengran 发表于 2023-12-26 19:18:56

加个volatile关键字试试

_奶咖君_ 发表于 2023-12-26 19:21:09

可以搜索一下OVERLAY 功能 ,,,如果资源足够可以关闭这个功能,,或者有能力修改调用树,

_奶咖君_ 发表于 2023-12-26 19:23:06

还有一件事,,你应该不是这样调用的吧,,你的fun2 利用指针调用的么?

rengran 发表于 2023-12-26 19:26:21

你可以在func1中的func2之前打印输出下*p的内容,在func2中再打印一下*p的内容,看看修没修改

zxcv1973 发表于 2023-12-26 20:15:11

可以在C251选项里选择产生可重入函数功能

jwd 发表于 2023-12-26 21:01:16

加static啊

杨为民 发表于 2023-12-27 00:54:23

本帖最后由 杨为民 于 2023-12-27 00:56 编辑

(1)这种现象很正常,很正确,这是C51编译器优化变量存储。

(2)func2()是func1()的最后一行, 指针P再也不会被使用,覆盖它修改它没有关系。
(3)出现这种现象不用理它。C51是智能优化,如果你在func2()调用后又引用了P,C51自然又会为它们分配不同的地址,不会出错的。
(4)关闭C51优化就不会产生这种现象了。

_奶咖君_ 发表于 2023-12-27 09:06:18

杨为民 发表于 2023-12-27 00:54
(1)这种现象很正常,很正确,这是C51编译器优化变量存储。

(2)func2()是func1()的最后一行, 指针P再 ...

关于第3点,,就算p不再被调用 也应该分配不同地址,,,就像我说的,他的func2绝对不是这样正常的调用,,,

zhangzhonghua 发表于 2023-12-27 09:49:50

本帖最后由 zhangzhonghua 于 2023-12-27 09:54 编辑

_奶咖君_ 发表于 2023-12-27 09:06
关于第3点,,就算p不再被调用 也应该分配不同地址,,,就像我说的,他的func2绝对不是这样正常的调用, ...

高手,确实不是函数名调用,而是用函数指针调用。

*g_pFunc = func2;   // 函数指针指向func2()

func1()
{
xInfo * pStruc = ...;    // 局部变量,指向某结构xInfo的指针,地址 0x0236
   ...
g_pFunc();   // 相当于调用func2()
                  // 到这里,发现 地址 0x0236 的内容被修改
...
}

func2()
{
uchar sw;   // 局部变量,地址居然也是 0x0236
sw = 0;      // 这里,就会把func1的局部变量pStruc给意外修改了
}


但是,我的程序里面是要用函数指针的。怎么办?我看看Overlay怎么搞。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 遇到局部变量被意外修改的问题,发现是编译器给2个局部变量分配了相同的地址?