代码大致这样的
#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 对这种情况一点都不吱声呢, 有什么工具能检查这种情况么?
谢谢
1
lovefantasy 2018-01-27 16:05:27 +08:00 via Android 1
|
2
geelaw 2018-01-27 16:10:40 +08:00
x86 的调用栈栈顶的地址数值小于栈底。
|
3
p64381 OP @lovefantasy 多谢。 这个很清楚的解释了为什么栈往下长。
|
4
pkookp8 2018-01-27 17:52:06 +08:00 via Android
一直搞不懂满升满降空升空降
|
6
gnaggnoyil 2018-01-27 22:17:59 +08:00
valgrind 不是用运行时 overhead 来检测 dynamic storage 的内存安全性的工具么?碰到像 LZ 这种 automatic storage 的情况一般都是无能为力吧?这种情况应该用 Clang 或者 GCC 的 UBsan 跑一遍.
|