2016-04-14 32 views
1

我使用的代码块时:获取分割故障运行的发行版本,而不是调试版本代码块

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 

当我设置选择目标“调试”并运行我的代码,它完美的工作。我已经运行了很多次,没有任何问题。但是,当我选择“释放”目标并经常从命令提示符运行程序时,会出现分段错误。

我的C++程序大约有一千行,我不知道程序的哪一部分导致了分段错误。所以我不知道在这个阶段哪个代码是相关的(当我有更多的信息时,我会在这里发布一些代码)。它确实利用指针和动态数据结构。我猜测有些东西没有被正确初始化,但是我不知道如何去调试“Release”版本。我没有改变任何编译器或链接器设置的默认值。 “版本”版本中可能会有什么不同导致此问题?

(更新)按照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”总是大于一):

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选项: - 初始化,但我没有看到这在Code Blocks中。

+3

使用一些'cout'语句来标记代码块。一旦你错了,你至少应该知道什么阻止了它,然后你从那里缩小它的范围。但你是对的。这很可能意味着你的代码中有一些UB。 – NathanOliver

回答

2

当变量 尚未像这样初始化时,是否可以让代码块/ GCC编译器发出警告?我看到有一个GCC选项:-Wuninitialized, 但我没有看到这个代码块

您可以添加不可从编译器设置任何编译器选项 - >编译器标志 菜单从工作区树视图导航你的项目 - >构建选项 - > {调试|版本} - >编译器设置 - >其他编译器选项 并将它们列在文本框中。

然而,没有必要以这种方式添加-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从代码::块启用编译器设置 - >编译器标志菜单 通过滴答项目警告 - >启用所有常见的编译器警告

代码:: Blocks的16.01(这是我目前有),即使该设置是不必要的,因为 为-Wall都启用调试,默认情况下发布配置, 因此警告正式出现在默认代码:: 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一直在 代码::块为6年左右,我用它默认的GCC选项,但也许我我错了。

相关问题