如何停止';诺雷顿';功能禁用'-Wreturn类型';GCC警告?
当使用可能扩展为具有如何停止';诺雷顿';功能禁用'-Wreturn类型';GCC警告?,gcc,abort,noreturn,Gcc,Abort,Noreturn,当使用可能扩展为具有noreturn属性的函数的宏时,是否有方法阻止它抑制-Wreturn类型 简单的例子: /*在单独的标题中定义*/ #ifndef NDEBUG #定义我的断言宏(test)((void)((test)?0:abort()) #否则 #定义我的断言宏(测试)((无效)(0?0:(测试))) #恩迪夫 /*C源文件*/ int函数(枚举MyEnum foo) { 开关(foo){ 案例A:返回1; 案例B:返回1; } 我的_断言_宏(0); /*一个明显的方法是通过使用-D
noreturn
属性的函数的宏时,是否有方法阻止它抑制-Wreturn类型
简单的例子:
/*在单独的标题中定义*/
#ifndef NDEBUG
#定义我的断言宏(test)((void)((test)?0:abort())
#否则
#定义我的断言宏(测试)((无效)(0?0:(测试)))
#恩迪夫
/*C源文件*/
int函数(枚举MyEnum foo)
{
开关(foo){
案例A:返回1;
案例B:返回1;
}
我的_断言_宏(0);
/*一个明显的方法是通过使用-D\uu noreturn\uuu=-fno builtin abort
编译,简单地禁用abort
上的noreturn属性。您还可以使用自定义包装器:
#include <stdlib.h>
#include <signal.h>
void myabort() {
raise(SIGABRT);
}
#define abort() myabort()
#包括
#包括
void myabort(){
升起(SIGABRT);
}
#定义中止()myabort())
并使用-include myabort.h
进行编译
但我建议不要这样做,而是在CI和/或预提交挂钩中的-Wall-Werror
下发布版本。发布版本可能会发出有用的警告,原因有很多,例如,因为启用了\u FORTIFY\u SOURCE
静态检查,或者在assert
中使用的一些变量变得未使用。因此,可以绕过abort
无法解决调试/发布不一致的问题。只编写自己的my_abort()
函数调用abort()怎么样
并且没有声明noreturn
,而是让您的宏调用它?使用实函数的问题是,它会使跨大型代码库的链接复杂化。您可以在标头中定义它,并使其为静态
,这样每个模块都会得到一个副本。如果编译器开始注意到它调用abort()
因此无法返回,请将其标记为\uuuuu属性((noipa))
。-D\uu noreturn\uuuuuuu=
在技术上是不可定义的行为吗?@JosephSible,为什么?\uuuuu noreturn\uuuuuu
和\uuu属性\uuuuuuuuuu>甚至都不是C标准的一部分。因为任何以两个下划线开头的都是保留的,而定义任何保留的都是UB。@JosephSible,我认为你是对的但正如我所说,我反对无论如何禁用中止
的想法。提议的解决方案无论如何都是黑客,不管有没有UB,黑客都是坏的。