我找到了亚瑟惠特尼这件神奇的作品 - http://www.jsoftware.com/jwiki/Essays/Incunabulum
它汇编了一些警告
$ gcc-4.7 incuna.c -o incuna.o
incuna.c: In function 'ma':
incuna.c:8:15: warning: incompatible implicit declaration of built-in function 'malloc' [enabled by default]
incuna.c: In function 'pi':
incuna.c:26:7: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]
incuna.c: In function 'nl':
incuna.c:26:24: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]
incuna.c: In function 'pr':
incuna.c:28:10: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]
incuna.c: In function 'ex':
incuna.c:35:36: warning: assignment makes integer from pointer without a cast [enabled by default]
incuna.c:35:25: warning: return makes pointer from integer without a cast [enabled by default]
incuna.c: In function 'noun':
incuna.c:37:57: warning: return makes integer from pointer without a cast [enabled by default]
incuna.c: In function 'wd':
incuna.c:39:21: warning: incompatible implicit declaration of built-in function 'strlen' [enabled by default]
但是在输入基本输入1 + 1
时会发生分歧。
./incuna.o
warning: this program uses gets(), which is unsafe.
1 + 1
[1] 11525 segmentation fault ./incuna.o
我猜这与1989年以来C编译器的不同有关。
我怎么能运行这个?我可以在最近的Linux / Mac上使用它吗?或在VirtualBox VM上?或其他什么?
我的谷歌搜索没有任何关联。
答案 0 :(得分:9)
它将指针转换为int
和long
,反之亦然。这打破了64位架构,它们具有不同的大小。
为32位目标编译它。例如,使用“-arch i386”在Mac OS X上使用clang / LLVM。
答案 1 :(得分:4)
我猜赌它因为这个而发生了分裂:
incuna.c:8:15:警告:内置函数'malloc'的不兼容隐式声明[默认启用]
如果没有声明malloc,那么它不会分配你的内存,你最终会取消引用null,这可能会导致seg错误。
包括:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
printf()
,malloc()
和strlen()
的警告消失了。如果您输入以下代码,则代码将运行并运行:
1+1
请注意 间距非常重要 :
1 + 1
将是段错误。
答案 2 :(得分:4)
仅通过预处理器运行:
gcc -E interp.c&gt;的interp-pp.c
然后在编辑器中对其进行美化,然后使用调试器来观察它的作用。
答案 3 :(得分:1)
在我的系统(AMD64 Win 8)上,似乎指针值通常设置了最高位,因此将指针视为整数(此程序所做的)将会出错并崩溃。
更改qv(a)
功能(&#34;查询动词&#34;)允许程序运行:
qv(a){R a<'a';}
应该是
qv(a){R a<'a'&&a>0;}
或
qv(a)unsigned a;{R a<'a';}
这是指minimally-modified version的链接,应该在没有警告的情况下编译(使用gcc,默认选项)并执行(使用正确的输入)。