【发布时间】:2016-04-14 16:38:28
【问题描述】:
我正在使用代码块:
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++ 程序大约有一千行,我不知道程序的哪一部分导致了分段错误。所以我不知道现阶段哪些代码是相关的(当我有更多信息时,我会在这里发布一些代码)。它确实利用了指针和动态数据结构。我猜有些东西没有正确初始化,但我不知道如何调试“发布”版本。我没有从默认值更改任何编译器或链接器设置。 “发布”版本中可能有什么不同会导致此问题?
(更新)按照 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 选项:-Wuninitialized,但我在代码块中没有看到这个。
【问题讨论】:
-
使用一些
cout语句来标记代码块。一旦出现故障,您至少应该知道它是从哪个块中识别出来的,然后再从那里缩小范围。但你是对的。这很可能意味着您的代码中有某种 UB。
标签: c++ linux gcc codeblocks