設計に問題があるrcv_mbf2010年02月09日 00時39分53秒

rcv_mbf()は指定したメッセージバッファIDのメッセージバッファからメッセージを受信するまで待つサービスコールです。

メッセージバッファへの送信はsnd_mbf()を使います。

ここで問題。

snd_mbf()には送信サイズを指定して、そのサイズがメッセージバッファ生成時に指定した最大サイズを超えているとエラーリターンします。

一方rcv_mbf()は受信したメッセージサイズをリターン値として取得するようなインターフェースはありますが、異常動作を未然に防ぐような仕組みは全く用意されていない。 この仕様だとどうなるかというとバグによりRAM領域を破壊する可能性が高い。

  • バッファサイズ100バイトのメッセージバッファを生成
  • 送信サイズは可変
  • 送信側タスクがメッセージバッファに20バイトのメッセージを送信
  • 受信側タスクが10バイトの領域を指定して受信
  • 受信は正常完了
  • 受信のリターン値は20バイト
  • 受信タスクは異常に気付かない
  • 全く別のタスクでRAM破壊による異常動作が発生

というような不具合が平気で発生します。

rcv_mbf()にstrncpy()のような最大サイズを指定するようなインターフェースを用意するのが組込み屋さんとしての最低限の実装でしょう。 その上でエラーリターンしてくれないと・・・・

代替案としてはrcv_mbf()を直接使うのではなく、受信サイズと領域サイズをチェックするようなマクロを通常は使うようにする。というようなところでしょうか。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
このブログでは「組込み」と「組み込み」のどちらを使っている?

コメント:

トラックバック

このエントリのトラックバックURL: http://kumikomi.asablo.jp/blog/2010/02/09/4867331/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。