[システム テスト]
システムテストを開始したところ、注文情報照会機能において不具合が見つかった。この不具合は、ある得意先の利用者IDでログインして画面から注文番号を入力すると、別の得意先の注文情報が出力されるというものであった。なお、ログイン処理時に、ログインした利用者IDと、利用者IDにひも付く得意先コード及び得意先名はセッションオブジェクトに保存されている。
注文情報照会機能には、業務処理を実行するクラス(以下、ビジネスロジッククラスという)及びリクエスト処理を実行するクラス(以下、サーブレットクラスという)が使用されている。注文情報照会機能が参照するデータベースのE-R図を図3に、Eさんが作成したビジネスロジッククラスのソースコードを図4に、サーブレットクラスのソースコードを図5に示す。
D主任、Eさん、Fさんは、不具合の原因が特定できず、セキュアプログラミングに詳しい技術課のHさんに協力を要請した。
Hさんはアプリケーションログ及びソースコードを解析し、不具合の原因を特定した。原因は、図4で変数(e)が(f)として宣言されていることである。この不具合は、①並列動作する複数の処理が同一のリソースに同時にアクセスしたとき、想定外の処理結果が生じるものである。
原因を特定することができたので、Eさんは、Hさんの支援の下、次の4点を行った。
⑴図4の2行目から5行目までのソースコードを削除する。
⑵図4の6行目を、図6に示すソースコードに修正する。
⑶図5の4行目と5行目を、図7に示すソースコードに修正する。
⑷保険的な対策として、図4の10行目の抽出条件に、セッションオブジェクトに保存された(i)と注文ヘッダテーブルの(j)の完全一致の条件をAND条件として追加する。
ソースコードの修正後、改めてシステム テストを実施した。システムテストの結果は良好であり、システムがリリースされた。
設問2
e:orderNo、f:static、下線①の不具合は何と呼ばれるか。15字以内で答えよ。:レースコンディション
不具合の原因を特定した。原因は、図4で変数(e)が(f)として宣言されていることである。
今回の問題においては、複数のメソッドから変更されるものが焦点となるので、
複数の個所から呼ばれているorderNoが原因となる。
orderNoはStaticで宣言されているので、答えはstaticとなる。
プログラミング言語の変数には、global/Static変数が存在します
クラス内に適宜され、複数のメソッドで呼ばれるような変数はクラス変数と呼びます。
①並列動作する複数の処理が同一のリソースに同時にアクセスしたとき、想定外の処理結果が生じる
このような不具合をレースコンディションといいます
www.ipa.go.jp
g:String orderNo、h:new、i:getOrderInfoBean(orderNo)
レースコンディションでクラス変数を削除した際に修正するコードになります
変更前:クラス変数を呼んでいたため、上から渡す必要がなかった
変更前
変更後
クラス変数による影響を修正する問題です。hの部分には、Newで新規に作り、
Newで作成したinfoBLObjにgetOrderInfoBean(orderNo)を入れて情報を取得するとなります。
j:得意先コード
⑷保険的な対策として、図4の10行目の抽出条件に、セッションオブジェクトに保存された(i)と注文ヘッダテーブルの(j)の完全一致の条件をAND条件として追加する。
この対策をしましょうという話なので、
①注文ヘッダテーブルの要素であること
②セッションオブジェクトに保存されている情報
つまり、問題文に書かれています得意先コード・得意先名
①と②の条件を満たすものは、得意先コードしかありません。
IPAの問題は迷った際には問題文に書いてあることがあるため、問題文に立ち返り、自分の妄想で書かないことが大事です