fbounds 检查不起作用,有啥替代品吗?

Posted

技术标签:

【中文标题】fbounds 检查不起作用,有啥替代品吗?【英文标题】:fbounds checking not working, any replacement?fbounds 检查不起作用,有什么替代品吗? 【发布时间】:2012-08-22 21:40:08 【问题描述】:

我试图让 fbounds 检查工作,但我没有成功。我收到以下错误:

/tmp/cczxKZzn.s:汇编器消息:

/tmp/cczxKZzn.s:48: 错误:`push' 的指令后缀无效

/tmp/cc9xD8T3.s:125:错误:“pop”的指令后缀无效

虽然我的 makefile 看起来像这样(使用简单的 makefile,一切都在正确编译):

all: error check

error: error.c
    /usr/local/gcc-4.0.2/bin/gcc -fbounds-checking -g -Wall -pedantic $< -o $@

.PHONY: clean check

clean:
    -rm error

check:  error
    ./error

由于该代码与汇编程序无关,我不知道该怎么办。汇编器问题是我在谷歌搜索中看到的唯一问题。


您能否提出其他解决方案,例如检查是否位于数组之外? 如(这是我的error.c):

#include <stdio.h>
#include <stdlib.h>
int main()

  int a[1][10];
  a[0][11]=42;
  return 0;


编辑。会不会是版本不兼容? gcc 4.4+ 已安装,我正在使用经过一点修改的 gcc 4.0.2 的路径来执行此操作?

【问题讨论】:

没有“fbounds”这样的东西。 -f 表示“标志”,所以它是边界检查标志。 @JimBalter 更改为“-bounds-check”后效果不佳。 我没有说将其更改为“-bounds-check”。请再读一遍我写的。它是“-f”+“边界检查”=“-fbounds-check”。正如我所说,关键是没有“fbounds 检查”之类的东西,这就是你的标题中所说的。 【参考方案1】:

由于该代码与汇编程序无关,我不知道该做什么 做。汇编器问题是我在谷歌搜索中唯一能看到的问题 关于那个话题。

看起来您调用了错误的汇编器 - 一个 32 位的汇编器,试图编译一个 64 位的目标代码。检查您的 PATH 和标志。

更新:我从来没有研究过 gcc 是如何调用它的组件的。我还不是很清楚。无论如何,它看起来不像我认为的那样依赖于 PATH,而是依赖于它的 ./configure 设置(--prefix、--build 等等)。

我的,带有--prefix=/usr,--build=x86_64-suse-linux,--program-suffix=-4.6, looks for its components in (with respect to the directory where thegcc`二进制文件驻留在: - ../lib64/gcc/x86_64-suse-linux/4.6 - ../lib64/gcc/ - ../lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/bin/x86_64-suse-linux/4.6/ - ../lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/bin/

(与strace 核对)。

如果其中一个目录中存在另一个 gcc 的二进制文件,它将被调用而不是“正确”的那个。

尝试使用gcc -v(或strace)查看正在运行的as

【讨论】:

makefile 中显示的路径是已安装包的路径(应该如此)。还有哪些检查途径?以及如何检查“标志”?提前致谢! 看到你的编辑,标志可能没问题,但我担心编译器的各种“部分”的调用可能会转到错误的 as 实例。检查 PATH 环境变量的值。在紧要关头,暂时将所需 gcc 的 bin 目录放在 PATH 中的任何其他内容之前。 @Iserni 我的 PATH 都没有对 gcc 或程序集的任何引用(我使用了 printenv 命令) 我明白了。使用另一个 gcc 4.0 的结果是什么? 这是来自 strace 的长日志。我直接进入/usr/local/中的gcc 4.0.2目录提供link【参考方案2】:

如果有人仍然需要使用这个古老的 gcc 版本运行边界检查: 你能做的最好的就是告诉它使用-Wa,--32 将相关参数传递给汇编器,所以你需要这个:

error: error.c
    /usr/local/gcc-4.0.2/bin/gcc -fbounds-checking -Wa,--32 -g -Wall -pedantic $< -o $@

背景信息:您的古代 gcc 生成 32 位汇编,而您的现代汇编默认为 64 位。对于大多数指令来说这不是问题,因为通常 32 位寄存器操作在 64 位模式下,推送和弹出是例外:它们不支持 64 位模式下的 32 位操作数。

【讨论】:

以上是关于fbounds 检查不起作用,有啥替代品吗?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate - @Transactional 不起作用有啥特别的原因吗?

UWP 上的 Accelerometer.Shaken 事件不起作用,有啥解决方案吗?

文件、编辑、选项等菜单在 Emacs 23 上不起作用,有啥想法吗?

背景位置在 iphone 设备中不起作用。有啥办法可以解决这个问题吗?

简单的 html dom file_get_html 不起作用 - 有啥解决方法吗?

我正在尝试向我的游戏窗口添加背景颜色,但它不起作用,并且不断弹出属性错误。有啥建议吗?