我正在使用代码块:
Release 13.12 rev 9501 (2013-12-25 18:25:45) gcc 4.8.2 Linux/unicode - 64 bit
在以下系统中:
Linux Mint 17.3 Cinnamon (version 2.8.7) 64-bit
Intel Core i7-4790
NVIDIA GeForce GTX 750 Ti
当我将所选目标设置为“Debug”并运行我的代码时,它完美地运行。我已经多次运行它没有任何问题。但是,当我选择“Release”目标并经常从命令提示符运行程序时,会出现分段错误。
我的C ++程序大约有一千行,我不知道该程序的哪个部分导致了分段错误。所以我不知道在这个阶段哪个代码是相关的(当我有更多信息时,我会在这里发布一些代码)。它确实利用了指针和动态数据结构。我猜测某些东西没有被正确初始化,但我不知道如何调试“发布”版本。我没有从默认值更改任何编译器或链接器设置。 “发布”版本可能有什么不同导致此问题?
(更新)根据Nathan的建议,我能够隔离分段错误。有一个for循环,但在某些情况下,这个循环的上限(结束索引)没有被初始化,如下所示:
void fnProc(bool var_val, int inp_val, int test_val, int st_idx, int lim_idx, int xarr[])
{
int idx, end_idx;
if (test_val > inp_val)
end_idx = someFn(inp_val, lim_idx, xarr);
if (!var_val)
for (idx = st_idx; idx <= end_idx; idx++)
xarr[idx] = 0;
}
通过将“end_idx”变量初始化为零(“st_idx”始终大于1),我能够解决问题:
void fnProc(bool var_val, int inp_val, int test_val, int st_idx, int lim_idx, int xarr[])
{
int idx, end_idx;
if (test_val > inp_val)
end_idx = someFn(inp_val, lim_idx, xarr);
else
end_idx = 0;
if (!var_val)
for (idx = st_idx; idx <= end_idx; idx++)
xarr[idx] = 0;
}
是否可以让代码块/ GCC编译器在没有像这样初始化变量时发出警告?我看到有一个GCC选项:-Wuninitialized,但我在代码块中没有看到这一点。
答案 0 :(得分:2)
是否可以让代码块/ GCC编译器在变量时发出警告 还没有像这样初始化?我看到有一个GCC选项:-Wuninitialized, 但我在代码块中没有看到这个
您可以添加编译器设置中未提供的任何编译器选项 - &gt; 编译器标志 从工作区树视图导航的菜单您的项目 - &gt; 构建选项 - &gt; {Debug | Release} - &gt; 编译器设置 - &gt; 其他编译器选项 并将它们列在文本框中。
但是,没有必要以这种方式添加-Wuninitialized
因为它
由-Wall
启用,并由您的代码使用通常的发布版本激发
优化-O2
(或任何高于-O0
): -
<强> Foo.cpp中强>
extern int someFn(int, int, int[]);
void fnProc(bool var, int inp_val, int test_val, int st_idx, int lim_idx, int xarr[])
{
int idx, end_idx;
if (test_val > inp_val)
end_idx = someFn(inp_val, lim_idx, xarr);
if (!var)
for (idx = st_idx; idx <= end_idx; idx++)
xarr[idx] = 0;
}
使用g ++ 5.2:
$ g++ -O2 -Wall -c foo.cpp
foo.cpp: In function ‘void fnProc(bool, int, int, int, int, int*)’:
foo.cpp:5:14: warning: ‘end_idx’ may be used uninitialized in this function [-Wmaybe-uninitialized]
int idx, end_idx;
^
这至少可以追溯到GCC 4.4.7
-Wall
已启用Code :: Blocks 编译器设置 - &gt; 编译器标志菜单
通过勾选项目警告 - &gt; 启用所有常见编译器警告。
在Code :: Blocks 16.01(我目前拥有)中,甚至不需要此设置
因为默认情况下为调试和发布配置启用了-Wall
,
因此警告适当地出现在默认的Code :: Blocks控制台项目发布版本中
foo.cpp
: -
-------------- Build file: Release in deleteme (compiler: GNU GCC Compiler 5.2)---------------
g++-5 -Wall -fexceptions -O2 -c /home/imk/develop/deleteme/foo.cpp -o obj/Release/foo.o
/home/imk/develop/deleteme/foo.cpp: In function ‘void fnProc(bool, int, int, int, int, int*)’:
/home/imk/develop/deleteme/foo.cpp:5:14: warning: ‘end_idx’ may be used uninitialized in this function [-Wmaybe-uninitialized]
int idx, end_idx;
^
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 1 warning(s) (0 minute(s), 0 second(s))
据我所知,-Wall
一直是默认的GCC选项
Code ::我已经使用了6年左右的块,但也许我错了。