如何抑制"警告:控制到达非空函数的结束"

Jen*_*ens 5 gcc warnings powerpc eabi

我有一些使用此函数的gcc交叉编译器翻译的PowerPC汇编代码:

uint32_t fill_cache(void)
{
    __asm__ ("addi 3, 0, 0\n");  /* R3 = 0 */
    /* More asm here modifying R3 and filling the cache lines. */
}
Run Code Online (Sandbox Code Playgroud)

在PowerPC EABI下,返回R3中计算的值.编译时,我得到

foo.c:105: warning: control reaches end of non-void function
Run Code Online (Sandbox Code Playgroud)

有没有办法教gcc实际返回一个值?或者有没有办法抑制警告(不删除-Wall或添加-Wno-*)?我想非常有选择地仅针对此功能禁止此警告,以便尽可能高地保留一般警告级别.

由于调用者需要计算的值,因此不能使此函数返回void.

Rob*_*son 13

解决方案1:使用诊断编译指示,您可以在本地禁止某些诊断检查.抱怨在非void函数中没有返回的特定选项(也由-Wall暗示)是-Wreturn-type.因此,禁止警告的具体代码是:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wreturn-type"
/* Your code here */
#pragma GCC diagnostic pop
Run Code Online (Sandbox Code Playgroud)

您可以通过使用-fdiagnostics-show-option进行编译来找出导致警告的选项.它只是将选项附加到警告消息.

解决方案2:定义寄存器变量并将其放入所需的寄存器中.请参阅内联汇编程序模板中的变量,并得到以下代码:

uint32_t fill_cache(void)
{
  register uint32_t cacheVal __asm__ ("r3");

  __asm__ __volatile__ ("addi %0, 0, 0" : "=r" (cacheVal));
  /* More code here */

  return cacheVal;
}
Run Code Online (Sandbox Code Playgroud)

挥发性调节剂是为了确保该指令是不会被删除或通过优化策略不希望影响到一些其他的方式.

解决方案2至少有两个原因:

  1. 就标准而言,无返回非空函数的值是不确定的.
  2. 没有压制(新)诊断警告的风险,首先无意压制.