新人技術者のためのロジカル・シンキング入門(2) ―― プログラミングにおける良いデータ構造
【3】DSPソフト開発のデータ管理方針(2/2)
● 「隠れスタティック・データ」に注意
スタティック・データを扱う場合,注意しなければならないのは,関数呼び出しにまたがって値を保持するものであるため,かならず初期値が定められていなければならないということです.つまり,スタティック・データのあるモジュールには,かならず初期化関数を用意しておく必要があるのです.もし初期化されていないと,不定値で処理を開始することになるため,プログラムの挙動がおかしくなります.
ダイナミック・データで気をつけなければならないのは,誤ってスタティック・データをダイナミック・データとして扱ってしまうことです.関数の呼び出しにまたがって値を保持していなければならないのに使い捨て領域に配置してしまうと,当然プログラムは正しく動作しません.ところが,単体テストでこれに気づかないこともありえます.見逃すと,「結合時に動かない」というはめになるのです.
小項目 | テスト方針 |
スタティック・データ | 初期化の手前で領域を埋めて動作 |
ダイナミック・データ | 関数呼び出しの手前で毎回領域を埋めて動作 |
以上の理由から,スタティック・データとダイナミック・データには特別のテストが必要となります(表3).具体的には,それぞれの領域を0xAAAAとか0x5555といった値で埋めるテストを行います(図8).スタティック・データは初期化の手前で,ダイナミック・データは通常処理の関数の手前で毎回初期化するようにします.こうすると,初期化漏れで不定値を初期値にしてしまうミスや,スタティック・データを誤ってダイナミック・データ扱いしてしまうというミスが見つかります.
スタティック・データを初期化しそこねて,不定値のまま処理していないかを確認するのが目的.ダイナミック・データについては,隠れスタティック・データがないかを確認することが目的.初期化(図の灰色の部分)で出力がおかしくならなければOK.
テーブルの場合,スタティック・データやダイナミック・データとは異なり,外部変数としてライブラリ内に配置します(呼び出し元に領域を持たないということ).テーブルは,読み出し専用の領域なので,外部変数として確保しても可読性や保守性が落ちてしまうことはないからです.ただし,そのデータがテーブルであることがわかるように,「テーブルはかならず大文字にする」などのコーディング規約を設けておくとよいでしょう.
● スタック・オーバフローの予防テスト
前述のように,ローカル変数に大きな配列をとってはなりません.そうすることで,スタック・オーバフローを招く事態が防げます.
もっとも,実際にスタック・オーバフローを起こしていないかを確認するテスト・ケースは別途必要となります.具体的には,スタック領域を0xAAAAとか0x5555といった値で埋めてテストを実施することになります(図9).DSPのソフトウェア開発では,リンク時のメモリ・マッピング情報を調べることができるので,こうしたテストが可能です.スタックは,通常のCPUではアドレスをさかのぼって消費していくのですが,それがどこまでたどり着いたかを,プログラムを動作させた後に確認すれば,スタック使用量がどれだけあるかを実測できるからです.
DSPのソフトウェア開発では,リンク時のメモリ・マッピング情報を調べることができる.そのため,スタックに用いる領域はあらかじめわかるので,それらをすべてなんらかの値で埋めつくして余りが出るかを調べる.