現在M3S-T4-Tinyを使用しており、わけあってlibファイルでなく、ソースを直接ビルドして使用しています。ビルドは通るし正常動作もしていますがe2studioのコード解析で以下の部分が引っ掛かっており気になっています。
ファイル:r_t4_rx\T4_src\tcp.c 1812行目
コード:ret = ret;
エラー内容:自分自身 'ret = ret'への代入
このようなコーディングは組み込み的にはよくある手法なのでしょうか。意図がわからないので教えてください。
zmbさん、こんにちは。NoMaYです。少し広い範囲で見たり、他の箇所を見たり、してみると以下のようなのですが、こういった事例としては以下のような理由が推測されます。個人の経験としてですが、たぶん、私以外にも、そう言われてみれば覚えがある人は少なくないのではないかなぁ、と思われるのです。私は、このコードを、そのように受け取ったのですけれども、、、(1) コンパイラで(デフォルト設定 or ワーニングレベルを上げたら)、あるいは静的解析ツールで、ワーニングが出たので消そうとして、コウナッタ(2) 最適化を行う設定で(あるいは最適化無しの設定であっても)デバッグ時に変数をウォッチ登録したら表示されなかったので苦肉の策として、コウナッタ(3) デバッグ時のブレークポイント設定箇所としてnop();を書こうとしたらコンパイルエラーになってしまったので苦肉の策として、コウナッタ(3') デバッグ時に関数の戻り値を知りたかったので、コウナッタ(4) 上記の(2)や(3)や(3')でリリース時に取り忘れた、あるいはリリース後の不具合解析でも有益と判断して敢えて残した(5) 上記の(1)や(4)でコメントを残す習慣の無い人がコードを書いたものの、誰もソースコードレビューで指摘しなかった(あるいはレビューをしなかった)ちなみに、コメントを書かない、コメントが意味不明である、というのは自分のことを今は棚に上げていますけれども、、、テヘヘ、、、あと、話を見え難くする要因として以下のようなこともありますので、理解は一筋縄では行かないような気もします。(A) ワーニングが出たツールが大昔のバージョンのものだったりして、今のものとは振る舞いが違っているかも(B) デバッガが大昔のバージョンのものだったり、あるいは今とは別のデバッガだったりするかも(C) 最初にソースを書いた人とは別の組織の別の人が別のコンパイラへの移植を受注して、かつ、時期も随分と後になってから、だったりとか少し広い範囲では:
#if defined(__GNUC__) _ether_snd_arp(ae);#else ret = _ether_snd_arp(ae); ret = ret;#endif
他の箇所では:
#if defined(__GNUC__) _ether_snd_arp(ae);#else ret = _ether_snd_arp(ae);#endif
zmbさん、こんにちは。NoMaYです。ちなみに、自己案件になりなすけれども、意味不明なコメントというのは、最近私が投稿したソースの以下の部分の1段落目と2段落目のようなものです。今、この瞬間であれば、試しに、コメントアウトしてコンパイルすればエラーになるのでよいのですけれども、何年後かに誰かが他のコンパイラへ移植しようとした時にその意図が通じるかどうか、、、(少なくとも when CC-RX is used と書けば良かったかもしれないけれども、今現在CC-RXしか想定していないし、、、)
// To prevent the symbol from being optimized out.void * const dummy_NORTi_INT_enter = (void *)v3_ent_int;void * const dummy_NORTi_INT_return = (void *)v3_ret_int;void * const dummy_INT_COMMON_nonOS = (void *)INT_COMMON_nonOS;void * const dummy_INT_COMMON_NORTi = (void *)INT_COMMON_NORTi;// To prevent the section name symbol `C$VECT` from being optimized out.void * const dummy_VECTTBL = (void *)__sectop("C$VECT");// To prevent a compile warning.void * const dummy2_NORTi_INT_HOOK = (void *)dummy_NORTi_INT_HOOK;
NoMaYさん
ご回答いただきありがとうございました。
概ねデバッグコードのごみ、もしくは開発環境や経緯に依存した現在は意味のないコードであろうという見解ですね。なるほど、それならば納得いくし、少し安心しました。私が知らないだけでvolatile的な効能でもあるのだろうかと邪推していたので...
コメントに関しても開発時の意図が後世に正しく伝わるかは難しいところですね。
自分は空のハンドラを作って置くときなどで、余計なワーニング(宣言した変数が使われていない)が出ないようにret += 0;みたいなコードをわざと書いておくことがたまにあるので、それかな?と思いました。後から代入するコードを書いて消し忘れたとかであれば、そういうこともあるかもしれません。