2017-07-06 13 views
3

を投げていない:「ボイド関数は、だから私は、明らかに、ボイド以下の機能を持っている "ノーリターン文の" 警告

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:1:98:警告:非返り値を返す関数のreturn文はありません[-Wreturn-type] "。

私はブランクの戻り値を追加しようとしましたが、運がない場合は0が返されました。

なぜこのエラーが発生するのか、どのように修正するのですか?

+1

関数はvoid *を返します。... static void * cpuStatsTestLoop(...) –

+3

関数の戻り値の型はvoid *です。コードはvoid *が返されることを期待しています –

答えて

9

これはvoid関数ではなく、void*voidポインタ)関数です。値を返す必要があります。値は、任意の型のデータへのポインタでなければなりません。つまり、NULLです。

関数が返されないため、returnは不要です。while(1)ループがあり、これは永遠に実行されます。より良いアプローチは、void*関数ではなく、void関数にすることです。ただし、あらかじめ定義された関数ポインタ型に準拠していなければなりません。

戻り値の型を変更する場合は、あなたが関数本体の終わりにreturn NULLを追加することで警告を消すことができますpthread_createstart_routineパラメータとしてこの関数を渡す必要がありますので、例えばオプションではありません。

+0

_関数の本文の末尾にNULLを追加して警告を消音することもできます。 _ "*" _の削除ははるかに優れています。コンパイラに応じて、代わりに「到達不能なコード」警告が表示されます。 –

+5

@PeterJこの関数を 'pthread_create'に渡すなど、関数ポインタがあらかじめ定義された署名に従わなければならない場合は、これは可能ではないかもしれません。 – dasblinkenlight

+0

この警告は、プログラマが戻り値の型を変更し、pthread_createなどに渡す間違った関数型にキャストしてUBを呼び出すように促すので、ひどいです。 –

1

この関数の戻り型はvoid *です。すなわち、voidではなく、任意の型のポインタです。したがって、値を返す必要があります。

戻り値の型をvoidに変更することでこれを修正できます。しかし、この関数はスレッドとして呼び出されることになっているようですが、その場合はvoid *(*)(void *)の署名が必要です。その場合、戻り値の型を変更することはオプションではありません。

この関数にはwhile (1)というループがあり、それは決して戻ってはいけません。それでも、関数は何かを返す必要があるので、底にreturn NULL;を入れてください。これはコンパイラを満足させ、後でループから脱出するようなバグを導入した場合の安全キャッチとして機能します。

関連する問題