パスワードを忘れた? アカウント作成
7033883 journal
日記

YoRの日記: 静的コードチェックについて 13

日記 by YoR

かなり昔の話だが、あるwarningに悩まされたことがある。
「アドレスを直接参照しないでください」
組み込み系ではよくあるのだが、I/O関係はメモリの直アドレスにマップされており、定義ヘッダファイルでそのアドレスにポインタ型でアクセスするようなマクロが作られる。

そういうプロジェクトでチェックツールを使うと、当然冒頭のwarningが出てくる。大量に。他の警告やらが見えなくなるほどに。
なのに、プロマネが「これもとってください」という。

どうやって?

当然ながら答えはこのwarningを抑止することなんだが、プロマネさんはそうしてくれなかった。
コンパイラによっては特別な構文を用意して(例えばpragmaとかで)こうならないようにしているものもあるのだけど、使っていた環境はそうではなかったということ。なのにそれを理解してくれない。
アドレスの直接参照が危険なのは当然承知しているのだが、プロジェクトの性質とかも勘案してチェック方法を決定しなければならないわけで。それを怠るプロマネは無能としか言いようがない。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • ポインタ変数を定義し、それをアセンブラコードで初期化してしまうんだ! (^o^)/

    多分、warning を「減らす」方法は似たようなもので、全部変数定義にして、その変数へ値を代入する関数を一か所にまとめるとか、そういう類ではないかと。

    --
    fjの教祖様
    • たぶん、コンパイラがアドレスを即値で使うことを期待してのマクロだと思うので、パフォーマンスが気になります。
      それに結構な数のI/Oがありましたから、ポインタ変数の格納場所が馬鹿にならないかと。

      どうすればいいか結構考えたんですけど、なかなかうまくいかなかった記憶があります。

      親コメント
      • …ふと思ったんだが。
        NULL を char * にキャストして、それに「アドレス」を足したらどうだったんだろう…

        # 多分「固定値をアドレスに足す」のは問題ないよね。

        「NULL」が、アドレスとして 0x00000000 でない場合、まずそれを補正する必要が出てしまいますが、多分それはマクロで一定のオフセットを加えるように指定すればなんとかなるはずで…

        --
        fjの教祖様
        親コメント
        •  dodongaです

           NULLは アドレスとしての 0 ではないです。
           足し算引き算してもダメです。

          #okky さんらしくない誤謬です。

          --
          閑話休題
          親コメント
          • NULLは アドレスとしての 0 ではないです。

            それは「純粋なる概念としてのC言語」だけの世界の話でしかありません。

            つまり、「どのような環境に持って行ってもうごくCで書かれたプログラム」を書きたければ、NULLを特定アドレスと仮定してはいけない(アドレスとして固定されると仮定することすらしてはいけない)。

            しかし、この問題は「組み込み用コーディングであり、絶対アドレスを数値指定する」という前提があります。
            なので、NULLは「何かしらのビット列で表現される固定アドレス」と想定して良いのです。

            で、「何かしらのビット列で表現される固定アドレス」であれば、それを char * にキャストして、適切な分だけ足すなり引くなりすれば「アドレス 0」になり、そこにさらに必要な値を足せば、必要な絶対アドレスになります。

            ---

            「NULLはアドレスとしての0ではない」
            は「特定処理系を考慮すれば 0 とは仮定できない」だけであって ( 0xFFFFFFFF になる処理系は確かにある)、「何かのアドレスになる」のは正しいのです。

            --
            fjの教祖様
            親コメント
    • by Anonymous Coward

      教祖様の額のような

  •  dodongaです。

     かなり昔の話ですが、静的なツールの不具合(機能不全)を手玉に全部ライブラリにした人を知っています。

     そのツールは

     呼び出されない関数は報告する。
     呼び出された関数が無い時は黙るw。

     だったので、アドレスマップ、生ポインタ、etc をアクセスする関数は全部 .a 等に押し込んで対処していました。

    --
    閑話休題
  • by Anonymous Coward on 2013年01月07日 13時14分 (#2301661)

    たいとるおんりー

typodupeerror

ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家

読み込み中...