SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

トップエスイーからのアウトカム ~ ソフトウェア工学の現場から

Webベース監視制御システムにおける状態同期の信頼性評価とその検証

トップエスイーからのアウトカム ~ ソフトウェア工学の現場から 第6回


モデル検査ツールの選定

 モデル検査を行うにあたっては、まずツールを選定する必要があります。今回の場合、すでに存在しているコードが検査対象であり、また規模も大きくなかったため、コードとの対応関係が分かりやすく、通信処理がモデル化しやすいSpinが適切だと判断しました。Spinは公式Webサイトからダウンロードできます。

 SpinではPromelaと呼ばれるC言語に似た独自言語で検査対象コードを記述します。例えばリスト1は、2人の顧客が預金(balance)から100円単位で入金と出金を繰り返している状況が記述されています。変数balanceは預金残高を示し、active [ 2 ]で2人分の預金口座を示すプロセスタイプが作られています。::->は、「もし~ならば、~をする」記述です。

リスト1(サンプルファイルのbalance.pml) 2人の顧客が預金から出入金を繰り返すPromelaのコード
short balance = 100

active [ 2 ] proctype customer() {
    START: do
        // 預金残高(balance)が100円以上の時に100円取り出す
        :: 100 <= balance -> balance = balance - 100;
        // 預金残高(balance)が200円未満の時に100円入金する
        :: balance < 200  -> balance = balance +100;
    od
    goto START;
}

 このコードを検査対象とし、預金残高(balance)が常に0以上であることを確認するにはリスト2の検査式を記述します。ltlは線形時相論理(Linear-time Temporal Logic)式を意味し、[] は「常に後続の条件(0 <= balance)が成り立つ」という意味です。

リスト2 預金残高の検査式
// 預金残高(balance)は常に0以上
ltl spec { [] (0 <= balance) }

 この状態でSpinによる検査を行うと、図3の赤枠「errors: 4」が示すように反例が4件あることが示されます。

図3 Spinによる検査を行った結果
図3 Spinによる検査を行った結果

 反例の1つを表示させると、残高が100円以上であるかどうかの評価(100 <= balance)と出金(balance = balance - 100)がアトミックに行われていないため、預金残高(balance)が0未満になることがあると示されています(図4)。

図4 検出された反例をSpinにて表示
図4 検出された反例をSpinにて表示

 このように、検査対象コードと検査式をPromelaで記述し、反例がないかどうかを検査することがSpinでの検査の流れとなります。反例がないということは、検索式が成り立たない場合がないと結論付けることができます。

同期処理に対する検査項目

 まず検査を行うにあたり、同期処理の何を検査するかを決めます。監視制御システムに求められる要求項目から、今回は表1の検査項目を選びました。

表1 同期処理に対する検査項目
検査項目1 サーバー再起動後、サーバーの状態がブラウザの状態から再同期されて設定される。またはブラウザ再起動後、ブラウザの状態がサーバー状態から再同期されて設定される。
検査項目2 一時的通信切断後、状態が再同期される。
検査項目3 状態の同期・再同期にあたり、サーバーとブラウザのどちらにおいてもその値が過去の値に戻ることがない。
検査項目4 複数のブラウザがサーバー上の同じ状態を参照する場合に、サーバー/ブラウザの再起動、一時通信切断が発生しても正しく同期される。

 ただし、Webアプリケーションであることやモバイル環境を考慮し表2の前提条件を追加しました。

表2 追加で設定した前提条件
前提条件1 HTTP通信の制約により、通信切断発生時に、サーバーないしはブラウザのどちらか一方しか切断を検知しない場合がある。
前提条件2 サーバー側のスレッド構造の制約により、受信したメッセージの処理順序が逆転することがある。
前提条件3 モバイル通信で発生する可能性が高いものとして、通信メッセージの消失がある。

次のページ
Promelaで記述した検査モデル

この記事は参考になりましたか?

トップエスイーからのアウトカム ~ ソフトウェア工学の現場から連載記事一覧

もっと読む

この記事の著者

古城 仁士(株式会社 東芝)(コジョウ マサシ)

 2015年度第10期生としてトップエスイーを受講。現業務では監視制御システムWeb化のためのフレームワーク開発に従事しており、リアルタイム性が強く信頼性の必要なWebアプリケーションを効率的に開発・テストする方法に関心がある。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10356 2017/08/31 20:27

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー