运行Release版本时出现分段错误,但代码块中没有调试版本

时间:2016-04-14 16:38:29

标签: c++ linux gcc codeblocks

我正在使用代码块:

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,但我在代码块中没有看到这一点。

1 个答案:

答案 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年左右的块,但也许我错了。