Thesis or Dissertation Javaの参照型変数と配列の静的null検出

武田, 真弥

2016 , 三重大学
Description
Java バイトコードを静的解析し,NullPointerException の発生とその原因を検出する.静的解析は,対象のプログラムを実行せずに,コードを読み取ることで解析する.また,全ての経路を考慮した網羅的な解析が可能で,潜在的なエラーを検出できる.NullPointerException はJava で頻繁に発生するエラーで,null をデリファレンスしていると発生する.それが発生すると動作が停止してしまうなどの誤動作を引き起こす重大なエラーである.FindBugs というJava の静的解析ツールがある.これは,NullPointerException を含んだ様々なバグを検出できるが,配列要素で発生するNullPointerException は解析できない.また,配列を解析するNikolic らのアルゴリズム(2012) は,配列と添え字に使われる変数に着目し,ループですべての要素が正しく初期化されるか解析する.例1: for( int i = 0 ; i < a.length ; i++ ) { a[i] = new A(); } この例1のように,配列の添え字が0 で始まり,比較,要素への代入,インクリメントがある場合に配列が正しく初期化できたと判定する.このアルゴリズムの問題点は,ループを用いた特定の初期化しか解析できず,各要素の初期化は解析できないことである.特に,初期化子を用いた初期化(例: A a[] = { new A(), new A()}) が扱えない.本研究では,このエラーを検出するために,参照型変数にnull の代入がある箇所の集合を伝播することで解析する.経路の合流点では,その集合の和集合を求める.その集合が非空の変数はnull になる経路があるとみなせるので,その変数をデリファレンスしていると警告を出す.また,集合の要素はnull の代入箇所を示すので,その代入箇所と発生箇所との間の経路を求めることができる.配列においては,配列の各要素を一つずつ初期化する場合とすべての要素を一度に初期化する場合に分けて解析する.各要素を一つずつ初期化する場合は,初期化された配列要素の番号を要素とする集合を用いて解析する.ループやAPI のArrays.fill メソッドやtoArray メソッドを用いて,すべての要素を一度に初期化する場合は,真偽値を用いて解析する.このように,配列の初期化を場合に分けて解析することで,集合の計算を減らすようにしている.また,本研究は手続き間解析も行う.各メソッドに対してデリファレンスされる可能性のある仮引数番号の集合と返り値の要約情報を格納することで,引数と返り値に関係するNullPointerException を検出できる.一度解析されたメソッドの呼び出しがあると,そのメソッドの要約情報を用いるので,各メソッドは一度しか解析しない.本研究の手法を,コンソールと統合開発環境Eclipse のプラグインとして実行できるように実装した. バグの原因になる可能性が高い物のみを検出する. 実行時間は一万行程度のプログラムに対して一秒前後で解析できる.
三重大学大学院 工学研究科 博士前期課程 情報工学専攻 コンピュータソフトウェア研究室
Full-Text

http://miuse.mie-u.ac.jp/bitstream/10076/15326/1/2015M232.pdf

Number of accesses :  

Other information