2017-07-06 47 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;放在底部。這將滿足編譯器的要求,並且它會作爲一個安全漏洞,以防您稍後引入導致您跳出循環的錯誤。