找回密码
 立即注册
楼主: zhangz***

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

[复制链接]

该用户从未签到

4

主题

52

回帖

160

积分

注册会员

积分
160
 楼主| 发表于 2023-12-27 18:00:21 | 显示全部楼层
本帖最后由 zhangzhonghua 于 2023-12-27 19:07 编辑

标记下本贴关键词以便查找。局部变量被意外修改,地址重叠,函数指针,调用树,Overlay,MAP文件,MEMORY MAP,OVERLAY MAP,编译时栈帧,运行时栈帧。
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    慵懒
    前天 08:41
  • 签到天数: 134 天

    [LV.7]常住居民III

    20

    主题

    1039

    回帖

    2459

    积分

    金牌会员

    积分
    2459
    发表于 2023-12-27 18:49:31 | 显示全部楼层
    老哥牛的,,把这个帖子升华了
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    61

    主题

    625

    回帖

    1万

    积分

    荣誉版主

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

    4)关闭C51优化就不会产生这种现象了。

    如果你没有进行其他设置(比如你强制它们Overlay),如果关闭优化还有这种不同层次的变量的地址相同现象,恭喜你中奖了,可以直接向Keil举报
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    前天 08:41
  • 签到天数: 134 天

    [LV.7]常住居民III

    20

    主题

    1039

    回帖

    2459

    积分

    金牌会员

    积分
    2459
    发表于 2023-12-27 19:35:32 | 显示全部楼层
    杨为民 发表于 2023-12-27 19:23
    4)关闭C51优化就不会产生这种现象了。

    如果你没有进行其他设置(比如你强制它们Overlay),如果关闭优 ...

    关闭优化并不算是一个很好的建议,,,除非所有人都有能力优化代码...老师 发个帖子系统的讲讲 overlay这个功能吧,,怎么正确的使用,,而不是一刀切,,虽然也很有用..  

    点评

    “发个帖子系统的讲讲 overlay这个功能吧”,这个问题可能很多人感兴趣,我尽早在这个版块单独发帖介绍吧  详情 回复 发表于 2023-12-27 20:04
    (1)本文的问题本质是楼主抖机灵,故意设套:“而我这个问题,根本原因是用了函数指针调用,而编译器不能正确理出调用树,又要Overlay去节省空间,结果搞得调用函数和被调用函数的局部变量地址重叠了。” 对于这种  详情 回复 发表于 2023-12-27 19:59
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    61

    主题

    625

    回帖

    1万

    积分

    荣誉版主

    积分
    10828
    发表于 2023-12-27 19:59:30 | 显示全部楼层
    本帖最后由 杨为民 于 2023-12-27 20:00 编辑
    _奶咖君_ 发表于 2023-12-27 19:35
    关闭优化并不算是一个很好的建议,,,除非所有人都有能力优化代码...老师 发个帖子系统的讲讲 overlay这个 ...


    (1)本文的问题本质是楼主抖机灵,故意设套(而且在一楼还隐瞒了):“而我这个问题,根本原因是用了函数指针调用,而编译器不能正确理出调用树,又要Overlay去节省空间,结果搞得调用函数和被调用函数的局部变量地址重叠了。”
    对于这种抖机灵,Keil的C51给出的解决方法就是关闭优化,你有能耐你自己玩!
    (2)所以我“关闭优化”只是告诉楼主C51解决他的这个特殊程序的问题的特殊手段,而非给其他任何人的建议。C51的智能优化功能(包括函数调用树分析)是很稳定可靠的,一般情况下不需要关闭。判断需不需要很简单,只要程序不出错,就使用高的优化等级。


    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    61

    主题

    625

    回帖

    1万

    积分

    荣誉版主

    积分
    10828
    发表于 2023-12-27 20:04:36 | 显示全部楼层
    _奶咖君_ 发表于 2023-12-27 19:35
    关闭优化并不算是一个很好的建议,,,除非所有人都有能力优化代码...老师 发个帖子系统的讲讲 overlay这个 ...

    “发个帖子系统的讲讲 overlay这个功能吧”,这个问题可能很多人感兴趣,我尽早在这个版块单独发帖介绍吧

    点评

    期待杨老师的专业讲解,编译器,尤其是 KEIL C51 / KEIL C251 我们还是听杨老师的专业建议  详情 回复 发表于 2023-12-28 08:29
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    4

    主题

    52

    回帖

    160

    积分

    注册会员

    积分
    160
     楼主| 发表于 2023-12-28 00:10:26 | 显示全部楼层
    本帖最后由 zhangzhonghua 于 2023-12-28 09:20 编辑

    不知道什么叫抖机灵、隐瞒、设套。整个问题定位过程如下。

    1、26日下班前发帖时,我还是一脸懵逼的,下班前匆匆忙忙,描述中只想到func1()调用func2(),没考虑到函数指针。
    2、27日上午上班,看到回复,提到Overlay和函数指针,简单查了一下,了解到函数指针会造成Overlay问题,回复中增加了函数指针描述。
    3、奶咖君指点了2个办法,维护调用树和NOOVERLAY。感觉维护调用树麻烦,就先用NOOVERLAY,结果到12点还弄不起来,也是奶咖君指出了错误。
    4、有人提到可重入函数,了解了下,感觉也不合适,回复了,准备还是按奶咖君的2个办法做。
    5、下午上班,继续深入了解Overlay,主要也不是看网络百度啥的,就是看Keil C51自带的Help手册,同时对比自己的MAP文件,边改、边调试、边看MAP文件变化,逐渐把Overlay、编译时栈帧的运作原理基本搞懂。
    6、27日下午4点,问题的根本原因和解决办法也弄清了,对比结果也出来了,发帖汇报。发帖按我喜欢看的风格来写,修改过几次。
    7、下班前,再发帖标记关键字。
    8、晚上,看到一些不舒服的字眼,再把过程描述下来。

    点评

    (1)首先我对我的用词向你道歉,我说话没有考虑你的感受,这是不对的,以后我回帖会注意的。 (2)我在第8楼回复之后,看到你第10楼的第一句话“高手,确实不是函数名调用,而是用函数指针调用。”,然后看到了你第  详情 回复 发表于 2023-12-28 12:18
    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 136 天

    [LV.7]常住居民III

    37

    主题

    870

    回帖

    3960

    积分

    荣誉版主

    积分
    3960
    发表于 2023-12-28 04:23:58 | 显示全部楼层
    keil 的 调用树, 无法对函数指针的调用, 给出正确答案, 我对此 的操作方法是, 多建几个空的用不着的中断程序, 在 每个中断中, 调用 一个 函数 (主程序中用函数指针调用的).

    这样, keil 的 调用树, 就能给出正确答案了.
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    4

    主题

    52

    回帖

    160

    积分

    注册会员

    积分
    160
     楼主| 发表于 2023-12-28 07:57:49 | 显示全部楼层
    LAOXU 发表于 2023-12-28 04:23
    keil 的 调用树, 无法对函数指针的调用, 给出正确答案, 我对此 的操作方法是, 多建几个空的用不着的中断程 ...

    1、你这个做法,看MAP文件仔细对比过修改效果吗?我觉得不是最佳的。
    2、最佳的方法,是Keil C51的Help手册给出的官方做法,修改调用树,我就是按这个做法去改,看MAP文件仔细对比过修改效果的。而且,也很简单,比你的做法改起来简单、直观。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9289

    回帖

    1万

    积分

    管理员

    积分
    14055
    发表于 2023-12-28 08:29:16 | 显示全部楼层
    杨为民 发表于 2023-12-27 20:04
    “发个帖子系统的讲讲 overlay这个功能吧”,这个问题可能很多人感兴趣,我尽早在这个版块单独发帖介绍吧 ...

    期待杨老师的专业讲解,编译器,尤其是 KEIL C51 / KEIL C251 我们还是听杨老师的专业建议

    点评

    (1)这是我看到的第二个深入讨论编译器选项的帖子,上次是在CosyOS的讨论中。 (2)C51/C251编译器有很多优化功能,也有很多编译和连接选项来控制这些优化功能。我个人很少使用这些选项,只是设置C51/C251的优化等  详情 回复 发表于 2023-12-28 13:18
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-2 15:14 , Processed in 0.078942 second(s), 71 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表