段错误的最小 C/C++ 程序? [复制]
Posted
技术标签:
【中文标题】段错误的最小 C/C++ 程序? [复制]【英文标题】:Minimal C/C++ program that segfaults? [duplicate] 【发布时间】:2012-09-06 10:51:19 【问题描述】:我正在尝试设置我的服务器处理核心转储的方式。为了测试它,我需要一个总是出现段错误的程序。
是否有一个总是出现段错误的简单示例程序?
【问题讨论】:
Coredump 或段错误?通常abort()
足以导致核心转储,而这实际上是真正的 程序的一部分。永远不会出现段错误。
这是 C 还是 C++?标签说 C,标题说两者。
@ShafikYaghmour :我的意思是最小的程序,用 C 或 C++ 编写的either,会出现段错误。如果需要,可以添加 C++ 标签。
【参考方案1】:
main() *(int *)0xdeadbeef = 37;
应该这样做。
【讨论】:
为什么是 37?应该是 42!【参考方案2】:main;
是可移植的,5个字符的段错误。
这是一个变量声明 - 隐含 int
类型(从 B 语言复制的功能),0
是默认值。执行时,它会尝试执行一个数字(数字不可执行),并导致SIGSEGV
。
来源:https://codegolf.stackexchange.com/questions/4399/shortest-code-that-raises-a-sigsegv
【讨论】:
正确,但可悲的是没有任何形式的解释来解释它为什么这样做(我知道为什么,但不是每个人都这样做)【参考方案3】:试试这个:
long* ptr = 0x0; //-- you can also use other random values and likely you will segfault
printf("%f", *ptr);
【讨论】:
【参考方案4】:你可以试试:
main()
char *p = NULL;
char c = *p;
【讨论】:
这可以被编译器的优化器消除。您希望指针指向一个 volatile 对象以使其正常工作。 @AlexeyFrunze : 只是不要打开优化 :)【参考方案5】:这应该死:
int main()
char *die;
printf("%d",(int *)die * 200);
return 0;
编辑:
int main()
char *die;
int killer = 200;
while(1)
printf("%d",(int *)die * killer);
killer = killer * killer;
return 0;
【讨论】:
为什么要这样?它是 UB,所以它可能,但它也可以只打印任意数字。 啊,甚至不能用 gcc 编译。您必须将char*
显式转换为整数才能编译(不确定编译器是否允许隐式转换,标准不允许,但我认为只需要诊断,而不是终止编译)。
现在它仍然是 UB,因为您使用的是未初始化指针的不确定值,但我不知道任何实际会崩溃的实现。您想如何导致崩溃的想法是什么?
那么你可能应该在某个地方取消引用指针。以上是关于段错误的最小 C/C++ 程序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
从共享内存段复制数据会导致客户端出现段错误(信号量和共享内存)