V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
p64381
V2EX  ›  问与答

请教为什么 C 语言里对函数的里面的局部变量越界写后会改变上层调用函数里面的变量呢

  •  
  •   p64381 · 2018-01-27 15:49:11 +08:00 · 1813 次点击
    这是一个创建于 2483 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码大致这样的

    #include <stdio.h>
    
    void fun2()
    {
    	struct tt
    	{
    		int len;
    		char buf[];
    	};
    	struct tt t1;
    	strcpy(t1.buf, "123456...."); // 这里造成越界写
    }
    
    void fun1()
    {
    	int i = 1;
    	fun2();
    	printf("i = %d\n", i); // 在开优化开 lto 的时候 i 的值会被 fun2 改变
    }
    
    

    我个人觉得这种情况应该是, 越界写改变栈的另外一个方向的内存啊, 不应该去改变上一层函数的变量啊. 还有为什么 valgrind 对这种情况一点都不吱声呢, 有什么工具能检查这种情况么?

    谢谢

    6 条回复    2018-01-27 22:17:59 +08:00
    lovefantasy
        1
    lovefantasy  
       2018-01-27 16:05:27 +08:00 via Android   ❤️ 1
    geelaw
        2
    geelaw  
       2018-01-27 16:10:40 +08:00
    x86 的调用栈栈顶的地址数值小于栈底。
    p64381
        3
    p64381  
    OP
       2018-01-27 16:12:22 +08:00
    @lovefantasy 多谢。 这个很清楚的解释了为什么栈往下长。
    pkookp8
        4
    pkookp8  
       2018-01-27 17:52:06 +08:00 via Android
    一直搞不懂满升满降空升空降
    p64381
        5
    p64381  
    OP
       2018-01-27 18:01:44 +08:00
    @pkookp8 不知你在说什么
    gnaggnoyil
        6
    gnaggnoyil  
       2018-01-27 22:17:59 +08:00
    valgrind 不是用运行时 overhead 来检测 dynamic storage 的内存安全性的工具么?碰到像 LZ 这种 automatic storage 的情况一般都是无能为力吧?这种情况应该用 Clang 或者 GCC 的 UBsan 跑一遍.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1315 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:50 · PVG 01:50 · LAX 09:50 · JFK 12:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.