C语言中抑制除法或模零编译器错误

C语言中抑制除法或模零编译器错误,c,crash,divide-by-zero,C,Crash,Divide By Zero,我正在编写一个C程序,希望触发一个异常,使程序在Windows上崩溃并调用Windows错误报告 我想,触发崩溃的一个好方法是除以零。但是,当我尝试这样做时,编译器不会编译程序并给出错误:C2124 有没有一种方法可以强制编译器编译程序,而忽略代码中的上述除以零语句 或者我应该找到另一种方法使我的程序崩溃吗?:) #包括 int main(int argc,字符**argv) { 返回1/0; } 1/0在编译时进行评估。编译器足够聪明,可以检测到它无法工作 我会做以下两件事: int a =

我正在编写一个C程序,希望触发一个异常,使程序在Windows上崩溃并调用Windows错误报告

我想,触发崩溃的一个好方法是除以零。但是,当我尝试这样做时,编译器不会编译程序并给出错误:C2124

有没有一种方法可以强制编译器编译程序,而忽略代码中的上述除以零语句

或者我应该找到另一种方法使我的程序崩溃吗?:)

#包括
int main(int argc,字符**argv)
{
返回1/0;
}

1/0
在编译时进行评估。编译器足够聪明,可以检测到它无法工作

我会做以下两件事:

int a = 0;
return 1/a;
(您可能会收到警告,但这将被编译)

或触发空指针访问:

int *p = NULL;
return *p;

1/0
在编译时计算。编译器足够聪明,可以检测到它无法工作

我会做以下两件事:

int a = 0;
return 1/a;
(您可能会收到警告,但这将被编译)

或触发空指针访问:

int *p = NULL;
return *p;

很难让C程序以定义良好的方式崩溃。事实上,这是一个矛盾的术语

最常用的方法是引发堆栈溢出、空指针取消引用和零除法。但编译器越来越善于发现这些技巧。递归可以展开到循环中,由于
1/0
是一个编译时可计算的常量表达式,并且其行为未定义,因此允许编译器编译失败

更可靠的方法是使用
中的
无效中止(void)
。至少C标准保证不会返回调用方:

#include <stdlib.h>
int main(int, char **)
{
    abort();
}
#包括
int main(int,char**)
{
中止();
}

很难让C程序以定义明确的方式崩溃。事实上,这是一个矛盾的术语

最常用的方法是引发堆栈溢出、空指针取消引用和零除法。但编译器越来越善于发现这些技巧。递归可以展开到循环中,由于
1/0
是一个编译时可计算的常量表达式,并且其行为未定义,因此允许编译器编译失败

更可靠的方法是使用
中的
无效中止(void)
。至少C标准保证不会返回调用方:

#include <stdlib.h>
int main(int, char **)
{
    abort();
}
#包括
int main(int,char**)
{
中止();
}

中止
,在
中定义,是导致程序异常终止的首选方式。但是,对于导致除零的特定意图,解决方案是对编译器隐藏除数:

volatile int x = 0;
return 1/x;
关键字
volatile
告诉编译器
x
可能以编译器未知的方式进行更改。这会阻止编译器知道它是零,因此编译器必须生成代码,以便在运行时执行除法,以防
x
更改为非零

当然,没有定义被零除的行为,因此不能保证导致程序终止


还要记住,“如果你对编译器撒谎,它会报复的。”(亨利·斯宾塞)。
中定义的中止是导致程序异常终止的首选方式。但是,对于导致除零的特定意图,解决方案是对编译器隐藏除数:

volatile int x = 0;
return 1/x;
关键字
volatile
告诉编译器
x
可能以编译器未知的方式进行更改。这会阻止编译器知道它是零,因此编译器必须生成代码,以便在运行时执行除法,以防
x
更改为非零

当然,没有定义被零除的行为,因此不能保证导致程序终止


还要记住,“如果你对编译器撒谎,它会报复的。”(亨利·斯宾塞).

您可以使用空指针访问调用?从用户处获取输入以绕过编译时检查?您可以使用空指针访问调用?从用户处获取输入以绕过编译时检查?
volatile
阻止某些优化,并不是抑制警告的好方法。@wonder.mices:它解决了OP对在程序执行过程中,而不是在编译过程中,创建一个被零除的错误,您有其他解决方案吗?没有人需要为此程序终止进行优化,并且仅在此处使用的此
x
是易变的,这一事实不会影响程序其余部分的优化。我支持使用
abort()
变体,只是担心
volatile
技术可能会被处于不同环境中的人们所使用,而这实际上很重要。不是有意否决,是偶然的点击,但当我注意到已经太晚了,对不起。
volatile
阻止某些优化,并不是抑制警告的好方法。@wonder.mices:它解决了OP在程序执行期间而不是在编译期间创建除零错误的请求,你有别的解决办法吗?没有人需要为此程序终止进行优化,并且仅在此处使用的此
x
是易变的,这一事实不会影响程序其余部分的优化。我支持使用
abort()
变体,只是担心
volatile
技术可能会被处于不同环境中的人们所使用,而这实际上很重要。我不是有意投否决票,只是偶然的点击,但当我发现已经太晚了,对不起。