2017-07-06 29 views
3

所以我有以下的功能,显然是无效:void函数抛出了 “不归路声明” 警告

static void *CpuStatsTestLoop (void *arg){ 
    UNUSED (arg); 

    rtems_object_set_name(rtems_task_self(), "CPU Usage Thread"); 

    while (1) 
    { 
     sleep (CPU_USAGE_REPORT_INTERVAL_SECS); 
     rtems_cpu_usage_report(); 
     rtems_cpu_usage_reset(); 
    } 
} 

,并抛出

“cpu_stats.c:98:1:警告:函数中没有返回语句返回非void [-Wreturn-type]“。

我试着添加一个空白返回并返回0没有运气。

任何想法为什么它抛出这个错误,以及如何解决?

+1

你的函数返回一个void * ... static void * cpuStatsTestLoop(...) –

+3

你的函数的返回类型是void *。该代码预计会返回一个void * –

回答

9

这不是void函数,这是一个void*void指针)函数。它必须返回一个值,它必须是指向任何类型数据的指针,或者NULL

在你的情况下,return是没有必要的,因为函数永不返回:它有一个while(1)循环,它永远运行。更好的方法是使其成为void函数,而不是void*函数,除非它必须符合某些预定义的函数指针类型。

如果更改返回类型是不是一种选择,例如,因为你必须通过这个功能的一个pthread_create参数start_routine您可以通过在函数体的末尾添加return NULL沉默警告。

+0

_您也可以通过在函数体的末尾添加返回NULL来消除警告。删除_“*”_好得多。根据编译器的不同,您会得到“无法访问的代码”警告。 –

+5

@PeterJ如果函数指针必须符合预先定义的签名,例如,因为您将此函数传递给'pthread_create',这在这里几乎肯定是这种情况,否则可能不可能。 – dasblinkenlight

+0

这个警告很糟糕,因为它鼓励程序员改变返回类型,然后调用UB,通过转换为错误的函数类型传递给pthread_create等。 –

1

该函数的返回类型为void *,即任何类型的指针,而不是void,所以它必须返回一个值。

您可以通过将返回类型更改为void来解决此问题。然而,它看起来像这个函数是作为一个线程调用的,在这种情况下它必须有void *(*)(void *)的签名,所以如果是这种情况,改变返回类型不是一个选项。

鉴于此函数有一个while (1)循环,它不应该返回。但是,该功能需要返回,因此请将return NULL;放在底部。这将满足编译器的要求,并且它会作为一个安全漏洞,以防您稍后引入导致您跳出循环的错误。