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 the
gcc`二进制文件驻留在:
- ../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 设备中不起作用。有啥办法可以解决这个问题吗?