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

2018-01-27 15:49:11 +08:00
 p64381

代码大致这样的

#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 对这种情况一点都不吱声呢, 有什么工具能检查这种情况么?

谢谢

1844 次点击
所在节点    问与答
6 条回复
lovefantasy
2018-01-27 16:05:27 +08:00
geelaw
2018-01-27 16:10:40 +08:00
x86 的调用栈栈顶的地址数值小于栈底。
p64381
2018-01-27 16:12:22 +08:00
@lovefantasy 多谢。 这个很清楚的解释了为什么栈往下长。
pkookp8
2018-01-27 17:52:06 +08:00
一直搞不懂满升满降空升空降
p64381
2018-01-27 18:01:44 +08:00
@pkookp8 不知你在说什么
gnaggnoyil
2018-01-27 22:17:59 +08:00
valgrind 不是用运行时 overhead 来检测 dynamic storage 的内存安全性的工具么?碰到像 LZ 这种 automatic storage 的情况一般都是无能为力吧?这种情况应该用 Clang 或者 GCC 的 UBsan 跑一遍.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/426399

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX