【发布时间】:2014-06-19 20:08:54
【问题描述】:
以下代码来自“黑客:剥削的艺术”第 2 版,名为 input.c
int main() {
char message[10];
int count, i;
strcpy(message, "Hello, world!");
printf("Repeat how many times? ");
scanf("%d", &count);
for(i=0; i < count; i++)
printf("%3d - %s\n", i, message);
}
这对我来说似乎是一个内存错误(溢出),因为数组 message 仅适用于 10 个字节。 但是,当我只用 gcc 编译它并执行程序时,它运行良好。
当我在编译过程中添加标志 gcc -m32 时,我得到 Abort trap 6 或表示有问题的错误(我在我的个人 mac 和我大学的 linux 计算机集群上尝试过这个,看看是否有不同. 在后者上,内存映射和回溯的堆栈粉碎有更多的显式错误,而我的 mac 只有 Abort Trap 6)。
无论如何,这是我的问题:为什么代码只适用于 gcc 而不是 gcc -m32 ? 另外,为什么我用 gcc -m32 编译文件后,如果我尝试只用 gcc 再次编译文件,它仍然无法工作?
我有很多不明白的地方,因此请提供有关为什么会发生这种情况的任何其他信息。谢谢。
【问题讨论】:
-
gcc 是哪个版本的?尝试
gcc --version至于第二个问题,尝试在编译之间删除所有.o文件。 -
strcpy 不是简单地写到缓冲区的末尾,而且碰巧不会覆盖任何重要的东西吗?
-
@Prof.Falken 如何列出目录中的所有 .o 文件?我通常有一个执行 rm -f $(programs) core *.o 的 make 文件,但是使用 gcc,你如何列出和删除 .o 文件?
-
另外,对于版本,它们配置为: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++ /4.2.1 Apple LLVM 版本 5.1 (clang-503.0.40)(基于 LLVM 3.4svn)目标:x86_64-apple-darwin13.2.0 线程模型:posix;对于 linux,gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
-
@vvayne,应该可以。