YoRの日記: 静的コードチェックについて 13
日記 by
YoR
かなり昔の話だが、あるwarningに悩まされたことがある。
「アドレスを直接参照しないでください」
組み込み系ではよくあるのだが、I/O関係はメモリの直アドレスにマップされており、定義ヘッダファイルでそのアドレスにポインタ型でアクセスするようなマクロが作られる。
そういうプロジェクトでチェックツールを使うと、当然冒頭のwarningが出てくる。大量に。他の警告やらが見えなくなるほどに。
なのに、プロマネが「これもとってください」という。
どうやって?
当然ながら答えはこのwarningを抑止することなんだが、プロマネさんはそうしてくれなかった。
コンパイラによっては特別な構文を用意して(例えばpragmaとかで)こうならないようにしているものもあるのだけど、使っていた環境はそうではなかったということ。なのにそれを理解してくれない。
アドレスの直接参照が危険なのは当然承知しているのだが、プロジェクトの性質とかも勘案してチェック方法を決定しなければならないわけで。それを怠るプロマネは無能としか言いようがない。
アセンブラを使うんだ、ルーク (スコア:1)
ポインタ変数を定義し、それをアセンブラコードで初期化してしまうんだ! (^o^)/
多分、warning を「減らす」方法は似たようなもので、全部変数定義にして、その変数へ値を代入する関数を一か所にまとめるとか、そういう類ではないかと。
fjの教祖様
Re:アセンブラを使うんだ、ルーク (スコア:1)
たぶん、コンパイラがアドレスを即値で使うことを期待してのマクロだと思うので、パフォーマンスが気になります。
それに結構な数のI/Oがありましたから、ポインタ変数の格納場所が馬鹿にならないかと。
どうすればいいか結構考えたんですけど、なかなかうまくいかなかった記憶があります。
Re:アセンブラを使うんだ、ルーク (スコア:1)
…ふと思ったんだが。
NULL を char * にキャストして、それに「アドレス」を足したらどうだったんだろう…
# 多分「固定値をアドレスに足す」のは問題ないよね。
「NULL」が、アドレスとして 0x00000000 でない場合、まずそれを補正する必要が出てしまいますが、多分それはマクロで一定のオフセットを加えるように指定すればなんとかなるはずで…
fjの教祖様
NULLはアドレスではないです (スコア:1)
dodongaです
NULLは アドレスとしての 0 ではないです。
足し算引き算してもダメです。
#okky さんらしくない誤謬です。
閑話休題
Re:NULLはアドレスではないです (スコア:1)
それは「純粋なる概念としてのC言語」だけの世界の話でしかありません。
つまり、「どのような環境に持って行ってもうごくCで書かれたプログラム」を書きたければ、NULLを特定アドレスと仮定してはいけない(アドレスとして固定されると仮定することすらしてはいけない)。
しかし、この問題は「組み込み用コーディングであり、絶対アドレスを数値指定する」という前提があります。
なので、NULLは「何かしらのビット列で表現される固定アドレス」と想定して良いのです。
で、「何かしらのビット列で表現される固定アドレス」であれば、それを char * にキャストして、適切な分だけ足すなり引くなりすれば「アドレス 0」になり、そこにさらに必要な値を足せば、必要な絶対アドレスになります。
---
「NULLはアドレスとしての0ではない」
は「特定処理系を考慮すれば 0 とは仮定できない」だけであって ( 0xFFFFFFFF になる処理系は確かにある)、「何かのアドレスになる」のは正しいのです。
fjの教祖様
Re:NULLはアドレスではないです (スコア:1)
どちらにしろ、「ポインタのアドレス直打ち」はNULLに限らずC言語として気持ち悪いのは確かですね。
okkyさんの言うようにこの話題は特定処理系に限定したほうがいいと思います。
Re: (スコア:0)
教祖様の額のような
「メーカからのパッチが来ましたので、linkします」 (スコア:1)
dodongaです。
かなり昔の話ですが、静的なツールの不具合(機能不全)を手玉に全部ライブラリにした人を知っています。
そのツールは
呼び出されない関数は報告する。
呼び出された関数が無い時は黙るw。
だったので、アドレスマップ、生ポインタ、etc をアクセスする関数は全部 .a 等に押し込んで対処していました。
閑話休題
結局どうしたのかが気になる (スコア:0)
たいとるおんりー
Re:結局どうしたのかが気になる (スコア:1)
自分の場合は、構造体を切ってlinkerのオプションでアドレスを固定しました。
でも、こんなことあまりやりたくないです。
Re:結局どうしたのかが気になる (スコア:1)
今すぐには出てこないのですが、どこかのメーカーではそのようなヘッダを作ってました。
全部をまとめるのではなくて、機能ごとに構造体を作って、その機能の先頭アドレスにその構造体を登録するような感じでした。
そのおかげで、マニュアルに書いてあるアドレスから辿れなくて、機能ごとに構造体の名前をヘッダから検索して…とかなりめんどくさいことになって閉口した覚えがあります。
Re: (スコア:0)
気になる気になる
Re:結局どうしたのかが気になる (スコア:1)
結局はとらなくていいことになりましたが、大量のwarningからより分けるための目grepでひどい目にあいました。