gcc 根据优化创建崩溃代码
gcc creates crashing code depending on optimisation
我有一个相当复杂的多线程代码,我使用 gcc 4.8.1 编译它。使用
编译时
g++ -c file.cc -march=native -mfpmath=sse -mpreferred-stack-boundary=4
--param inline-unit-growth=50 -ggdb3 -Wall -Wextra -Winit-self
-O2 -fPIC -funroll-loops -fforce-addr -rdynamic
代码产生了段错误崩溃(我无法调试,但是结构的地址突然与构造时的地址不同,特别是不再按照 32bytes 的要求对齐代码,但只有 8 个字节)。
当使用 -O1
编译时,代码工作正常。然后我添加了所有在 -O1
和 -O2
之间产生差异的优化标志。 (为此,我通过
创建了两个文件 O1-opts
和 O2-opts
g++ -march=native -mfpmath=sse -mpreferred-stack-boundary=4
--param inline-unit-growth=50 -ggdb3 -Wall -Wextra -Winit-self
-O1 -fPIC -funroll-loops -fforce-addr -rdynamic
-Q --help=optimizers > O1-opts
g++ -march=native -mfpmath=sse -mpreferred-stack-boundary=4
--param inline-unit-growth=50 -ggdb3 -Wall -Wextra -Winit-self
-O2 -fPIC -funroll-loops -fforce-addr -rdynamic
-Q --help=optimizers > O2-opts
当diff O1-opts O2-opts
提供选项差异时)。将 all 选项差异添加到 -O1
时,生成的代码仍然不会崩溃。这让我很困惑。所以我的问题是:这不应该 完全 与 -O2
相同的结果吗? (还有:我的问题的可能原因是什么?)
关键是 -O2
选项不仅设置了不同的标志,而且与 -O1
相比还启用了额外的优化。
GCC Wiki 的 FAQ 部分有一个适合 this 的条目。
我有一个相当复杂的多线程代码,我使用 gcc 4.8.1 编译它。使用
编译时g++ -c file.cc -march=native -mfpmath=sse -mpreferred-stack-boundary=4
--param inline-unit-growth=50 -ggdb3 -Wall -Wextra -Winit-self
-O2 -fPIC -funroll-loops -fforce-addr -rdynamic
代码产生了段错误崩溃(我无法调试,但是结构的地址突然与构造时的地址不同,特别是不再按照 32bytes 的要求对齐代码,但只有 8 个字节)。
当使用 -O1
编译时,代码工作正常。然后我添加了所有在 -O1
和 -O2
之间产生差异的优化标志。 (为此,我通过
O1-opts
和 O2-opts
g++ -march=native -mfpmath=sse -mpreferred-stack-boundary=4
--param inline-unit-growth=50 -ggdb3 -Wall -Wextra -Winit-self
-O1 -fPIC -funroll-loops -fforce-addr -rdynamic
-Q --help=optimizers > O1-opts
g++ -march=native -mfpmath=sse -mpreferred-stack-boundary=4
--param inline-unit-growth=50 -ggdb3 -Wall -Wextra -Winit-self
-O2 -fPIC -funroll-loops -fforce-addr -rdynamic
-Q --help=optimizers > O2-opts
当diff O1-opts O2-opts
提供选项差异时)。将 all 选项差异添加到 -O1
时,生成的代码仍然不会崩溃。这让我很困惑。所以我的问题是:这不应该 完全 与 -O2
相同的结果吗? (还有:我的问题的可能原因是什么?)
关键是 -O2
选项不仅设置了不同的标志,而且与 -O1
相比还启用了额外的优化。
GCC Wiki 的 FAQ 部分有一个适合 this 的条目。