“控制到达非无效函数的末尾”产生错误而不是警告

"control reaches end of non-void function" produces error instead of warning

提问人:dww 提问时间:3/13/2022 最后编辑:Dima Chubarovdww 更新时间:11/11/2023 访问量:182

问:

我正在尝试编译一个大型项目(https://github.com/ESCOMP/CTSM)。如果可能的话,我想按原样编译它,而不编辑代码(众所周知,它可以在许多平台上成功构建)。

我正在使用 .我得到gcc (SUSE Linux) 11.2.1

在函数 ncmp 中:/run/media/dominic/hdbtrfs/dominic/git/ESCOMP/CTSM/cime/src/share/timing/gptl.c:4069:1:错误:控制到达非 void 函数的末尾 [-Werror=return-type]

从以下函数。我相信在这种情况下,早期版本的 gcc 只会发出警告而不是错误。

/*
** ncmp: compares values of memory adresses pointed to by a pointer. for use with qsort
*/

static int ncmp( const void *pa, const void *pb )
{
  static const char *thisfunc = "GPTLsetoption";
  const char** x = (const char**)pa;
  const char** y = (const char**)pb;

  if( *x > *y )
    return 1;
  if( *x < *y )
    return -1;
  if( *x == *y )
    GPTLerror("%s: shared memory address between timers\n", thisfunc);
}

我希望可以通过在函数末尾插入虚假语句来解决此问题,但由于我有兴趣尝试构建代码的未修改版本(我目前不是该项目的贡献者,因此无法将更改推送到上游)我想知道是否有解决方法可以使用编译器标志将此错误转换为警告?return

根据要求,这里是由 makefile 生成的 gcc 调用:

mpicc -c -I/run/media/dominic/hdbtrfs/dominic/git/ESCOMP
/CTSM/cime/src/share/timing  -std=gnu99 -O    -DCESMCOUPLED 
-DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU  -DCESMCOUPLED  
-DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU  -DNUOPC_INTERFACE 
-DHAVE_MPI /run/media/dominic/hdbtrfs/dominic/git/ESCOMP
/CTSM/cime/src/share/timing/gptl.c
C GCC CIME

评论

0赞 KamilCuk 3/13/2022
请发布完整的错误消息。
0赞 Weather Vane 3/13/2022
请参阅 gcc 选项:关于不带 return 语句的非 void 函数的警告
0赞 Eric Postpischil 3/13/2022
编辑问题以提供最小的可重现示例,包括删除对未声明的调用(如果不需要),并显示传递给 GCC 的命令行选项。根据编译器资源管理器,GCC 的默认选项不会显示任何警告或错误,但如果请求,则会显示。但 GCC 4.1.2 也是如此,这与您对早期版本的看法相冲突。那么,您是否使用在 GCC 11.2.1 中产生警告但在 4.1.2 中不产生警告的选项?它们是什么?GPTLerror-Wall
0赞 chux - Reinstate Monica 3/13/2022
“我想按原样编译它,而不编辑代码” --> 当有人错误地编辑了 .c 文件中的某些内容时,一个用于静默所选 .c 文件错误警告错误的选项,该选项可以简单地设置为将来失败,并且会从静默的警告错误中受益。与其把罐子踢到路上,不如考虑修复代码。
0赞 Nate Eldredge 3/14/2022
从长远来看,更好的解决方法是与_Noreturn一起声明(假设它确实永远不会返回)。GPTLerror

答:

1赞 John Bollinger 3/13/2022 #1

我想知道是否有使用编译器标志将此错误转换为警告的解决方法?

我希望该选项具有这种效果。还应该可以将范围缩小到您报告的特定诊断,但请注意:仅使用命令行选项无法将影响缩小到问题的此特定实例。-Wno-error

补遗

该问题已被编辑以显示诊断类别是 ,我可以说,人们会用它来使这种类型的所有诊断发出警告而不是错误。return-type-Wno-error=return-type

评论

0赞 dww 3/13/2022
谢谢 - 任何知道如何“将范围缩小到特定诊断”的想法。gnu 参考页面似乎没有提供任何关于如何使用这个标志的信息。
1赞 John Bollinger 3/13/2022
@dww,这里要认识到的是,在警告选项前面加上前缀是一种通用工具,而不是基于每个选项进行记录。您现在添加到问题中的完整错误消息提供了所需的信息:所涉及的诊断类别的名称是 。正如文档指定可以使用表单仅指定特定诊断一样,也可以用于应用于特定诊断。我会修改这个答案。no-return-type-Werror=n-Werror-Wno-error=n-Wno-error
2赞 Eric Postpischil 3/13/2022 #2

-Werror将所有警告提升为错误。对于特定警告,您可以使用 反转此设置,例如 ,如 GCC 文档中明确记录的警告选项-Wno-error=WarningName-Wno-error=return-type

此开关 [] 采用否定形式,用于否定特定警告;例如,即使警告生效,警告也不会成为错误。-Werror=-Werror-Wno-error=switch-Wswitch-Werror