我正在尝试编写一个相当简单的递归洪水填充算法(作为 MATLAB mex 函数运行),但是在打开 GCC 中的优化标志时遇到了问题(如果重要的话,v 7.5.0)。代码在没有打开任何优化标志的情况下工作正常,但是当我使用 -O2 或 -O3 标志时会出现段错误。我已经将罪魁祸首缩小到一个被 GCC 优化的索引变量——如果我将它指定为一个易失性变量,即使在更高的优化级别上也不会发生段错误。我假设我必须使用未定义的行为,但我看不出这可能发生在哪里。
有问题的代码片段:
#include "mex.h"
#include <string.h>
// Removing this causes the program to segfault -----v
void fill(double *image, signed int x, signed int n, volatile signed int i, double k)
{
image[i] = k;
if ((i-1) >= 0 && ((i-1) % x) < (i % x) && image[i-1]==1)
fill(image,x,n,i-1,k);
if ((i-x) >= 0 && image[i-x]==1)
fill(image,x,n,i-x,k);
if ((i+1) < n && ((i+1) % x) > (i % x) …Run Code Online (Sandbox Code Playgroud) 我似乎无法在 gdb 中禁用分页。我已经阅读了所有建议添加set pagination off或set height 0或添加set height unlimited到我的 ~/.gdbinit 文件的各种答案,并且我已经尝试了所有这些,但是 gdb 似乎忽略了所有这些。当我启动 gdb 时,它显然在读取 ~/.gdbinit 文件,因为我可以设置自动加载安全路径,但是每次启动时,我都必须再次按 Enter 才能启动 gdb,这非常令人沮丧. 就好像它只是完全忽略了分页关闭命令。我也尝试将这些命令添加到系统范围的 gdbinit(在/etc/gdb/gdbinit),但这也不起作用。
就其价值而言,我正在运行带有 GDB 版本的 Xubuntu 18.04 (GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git)。.gdbinit 文件当前读取:
set auto-load safe-path /
#set height 0
#set height unlimited
set pagination off
Run Code Online (Sandbox Code Playgroud)
编辑:为了澄清,出于各种原因,我必须让我的终端相当短(约 13 行左右)。当我启动 GDB 时,我会看到以下内容:
GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later …Run Code Online (Sandbox Code Playgroud)