- 主题:gcc竟然把未初始化的int局部变量直接初始化为0
起因是有一个程序到vs下调试,直接报未初始化下标数组越界。可是这在linux下运行的很好啊。一看代码,果然没有初始化。
然后写个测试程序,gcc下果然是0。
Ubuntu16.04下测试的
--来自微水木3.5.10
--
FROM 222.64.89.*
release不会,debug会
【 在 foliver 的大作中提到: 】
: 起因是有一个程序到vs下调试,直接报未初始化下标数组越界。可是这在linux下运行的很好啊。一看代码,果然没有初始化。
: 然后写个测试程序,gcc下果然是0。
: Ubuntu16.04下测试的
: ...................
--
FROM 220.181.3.*
我就是O2编译的啊
【 在 blessman 的大作中提到: 】
: release不会,debug会
: 【 在 foliver 的大作中提到: 】
: : 起因是有一个程序到vs下调试,直接报未初始化下标数组越界。可是这在linux下运行的很好啊。一看代码,果然没有初始化。
: ...................
--来自微水木3.5.10
--
FROM 222.64.89.*
还可能有个原因。
应用程序向 linux 内核申请内存的时候,为了防止申请到其它进程不要的内存,读到隐私的数据,内核会先把内存段清零再返回给进程。
linux 下的进程申请栈空间使用的是 mmap(MAP_STACK),所以拿到的内存可能是清零后的内存。
【 在 foliver 的大作中提到: 】
: 起因是有一个程序到vs下调试,直接报未初始化下标数组越界。可是这在linux下运行的很好啊。一看代码,果然没有初始化。
: 然后写个测试程序,gcc下果然是0。
: Ubuntu16.04下测试的
: ...................
--
FROM 27.154.93.*
输出都是3,没有初始化为0啊。 linux gcc, debug
void foo() {
int a;
cout << "foo a is " << a << endl;
}
void bar() {
int a = 3;
cout << "bar a is " << a << endl;
}
int main()
{
bar();
foo();
return 0;
}
【 在 foliver 的大作中提到: 】
: 起因是有一个程序到vs下调试,直接报未初始化下标数组越界。可是这在linux下运行的很好啊。一看代码,果然没有初始化。
: 然后写个测试程序,gcc下果然是0。
: Ubuntu16.04下测试的
: ...................
--
FROM 180.158.169.*
你跑了一次看到是0,就一定每次都是0,就一定是gcc干的?
【 在 foliver 的大作中提到: 】
: 起因是有一个程序到vs下调试,直接报未初始化下标数组越界。可是这在linux下运行的很好啊。一看代码,果然没有初始化。
: 然后写个测试程序,gcc下果然是0。
: Ubuntu16.04下测试的
--
FROM 36.250.214.*
那就不知道了。代码是已经使用了好几年大型程序的一部分。
【 在 cn62 的大作中提到: 】
: 你跑了一次看到是0,就一定每次都是0,就一定是gcc干的?
:
: 【 在 foliver 的大作中提到: 】
: ...................
--来自微水木3.5.10
--
FROM 222.64.89.*
c 语言标准就没规定初始成什么吧
【 在 foliver 的大作中提到: 】
: 起因是有一个程序到vs下调试,直接报未初始化下标数组越界。可是这在linux下运行的很好啊。一看代码,果然没有初始化。
: 然后写个测试程序,gcc下果然是0。
: Ubuntu16.04下测试的
--
FROM 36.110.18.*
这很简单就能确认是不是gcc干的,反汇编看一下release版的ELF文件那里填写的是啥
bss段一般没东西
--
FROM 114.241.228.*
这是stack甚至有可能被优化成寄存器
【 在 z16166 (Netguy) 的大作中提到: 】
: 这很简单就能确认是不是gcc干的,反汇编看一下release版的ELF文件那里填写的是啥
:
: bss段一般没东西
: --
--
FROM 123.113.247.*