2017/02/17

[c/c++]関数のvoidキャストでignoring returnは回避できない

昔・・・といっても半年程度だが、その頃に書いたARM向けのソースを改造しようとした。

Linux向けに書いていたから、コンパイラをarm-linux-gccをgccにすればよかろう、とコンパイルしたものの、エラーになった。

ignoring return value of 'read', declared with attribute warn_unused_result [-Werror=unused-result]

read()を使っているところがあり、そこはデータの読み捨てだったので、結果が正しかろうとどうだろうと気にしていなかったのだ。
だから、

(void)read(fd, dummy, sizeof(dummy));

のように書いていたのだが、戻り値を(void)してもダメなのだな。。。

splintなんかはprintf()でも警告が出ていたのだが、(void)でキャスト回避できたのでそうしていたが、いやはや時代は厳しくなったものだ。
半年前はコンパイルできていたのは、たぶん提供された開発環境がそんなに新しいものではなかったからだろう。


warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result - 簡潔なQ

全部の戻り値がある関数で出るのではなく、attributeで指定しているものだけが出るようだ。
まあ、エラーメッセージもそう書いているしな。

回避は、チェックするか、コンパイルオプションで逃げるか。
ここだけのためにコンパイルオプションを指定するのもしゃくだが、不要なチェック処理を追加するのも腹立たしい。

int ret = read(fd, dummy, sizeof(dummy));

チェックしなくても、誰かに代入するだけで安心してくれるようだ。
まあ、あとはコンパイラかリンカが最適化して捨ててくれるだろうから、これでよいか。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。