JP6945434B2 - ソフトウェア開発装置、ソフトウェア開発方法およびソフトウェア開発プログラム - Google Patents

ソフトウェア開発装置、ソフトウェア開発方法およびソフトウェア開発プログラム Download PDF

Info

Publication number
JP6945434B2
JP6945434B2 JP2017241318A JP2017241318A JP6945434B2 JP 6945434 B2 JP6945434 B2 JP 6945434B2 JP 2017241318 A JP2017241318 A JP 2017241318A JP 2017241318 A JP2017241318 A JP 2017241318A JP 6945434 B2 JP6945434 B2 JP 6945434B2
Authority
JP
Japan
Prior art keywords
address
function
unit
software development
argument
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2017241318A
Other languages
English (en)
Other versions
JP2019109639A (ja
Inventor
敏樹 北島
敏樹 北島
高橋 克英
克英 高橋
利大 小林
利大 小林
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Mitsubishi Electric Corp
Original Assignee
Mitsubishi Electric Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Mitsubishi Electric Corp filed Critical Mitsubishi Electric Corp
Priority to JP2017241318A priority Critical patent/JP6945434B2/ja
Publication of JP2019109639A publication Critical patent/JP2019109639A/ja
Application granted granted Critical
Publication of JP6945434B2 publication Critical patent/JP6945434B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Description

本発明は、ソフトウェア開発装置、ソフトウェア開発方法およびソフトウェア開発プログラムに関する。特に、特定のプログラムを記述した際に利用者に警告を通知するソフトウェア開発装置、ソフトウェア開発方法およびソフトウェア開発プログラムに関する。
昨今のソフトウェア開発では、テキストベースのソースコードを図あるいはリストで表現することにより可視性を上げている。可視性の向上により、レビュー段階での欠陥検出を容易にし、バグ混入を防止することができる。プログラムの構造を可視化するツールとして、静的解析ツールが知られている。
静的解析ツールは、プログラムを実行せずにソースコードを解析し、コールツリーあるいは品質メトリクスを提供する。コールツリーは、関数同士の参照関係を表す図である。品質メトリクスは、プログラム品質を数値化したものである。また、静的解析ツールは、ソースコードを対象として解析するので、プログラムの実行環境および開発環境に左右されずに解析することができる。
一方、プログラムにおけるアドレスは、プログラム実行時あるいはプログラム実行中に割り当てられる。そして、プログラム実行中には、変数あるいは関数が指し示すアドレスは動的に変化する。よって、静的解析ツールによりアドレス参照を網羅することは困難である。
特許文献1には、ソフトウェア開発においてバグを起こすことが比較的多い大域変数のアドレス参照を解析し、参照関係にある変数同士を図表で表示する技術が開示されている。
特開2011−257872号公報
しかし、特許文献1のようにアドレス参照を解析する技術があるにも関わらず、アドレス参照を正確に解析できない静的解析ツールは多い。その理由はアドレス参照を解析するためにはプログラムを擬似的に実行する必要があるからである。プログラムを擬似的に実行して全ての変数組み合わせを解析するには時間がかかる。また、高性能で高価格なコンピュータが要求される。コンピュータ性能あるいはソースコードの構造にも寄るが、1Mラインを超える大規模ソースコードを静的解析ツールで解析すると、コンピュータがフリーズし、正常に解析が完了しないケースも発生する。
本発明は、アドレス参照に関する特定の記述を監視し、特定の記述がされた場合、利用者に警告を通知する。これにより、利用者に対してソースコードの構成的課題を是正させ、静的解析ツールにおける解析時間の増加を抑制することを主な目的とする。
本発明に係るソフトウェア開発装置は、
複数の関数を含むソースコードを分析し、前記複数の関数のうち引数のアドレス渡しを行っている特定関数を抽出するとともに、前記特定関数が連続して引数のアドレス渡しを行っている連続回数を抽出する構造分析部と、
前記連続回数が、前記特定関数により引数のアドレス渡しが行われていることを警告するための警告条件を満たすか否かを監視し、前記連続回数が前記警告条件を満たす場合に、前記特定関数により引数のアドレス渡しが行われていることを警告する警告情報を出力する監視部とを備えた。
本発明に係るソフトウェア開発装置では、構造分析部が、複数の関数のうち引数のアドレス渡しを行っている特定関数を抽出するとともに、特定関数が連続して引数のアドレス渡しを行っている連続回数を抽出する。監視部が、連続回数が、特定関数により引数のアドレス渡しが行われていることを警告するための警告条件を満たすか否かを監視し、連続回数が警告条件を満たす場合に、特定関数により引数のアドレス渡しが行われていることを警告する警告情報を出力する。よって、本発明に係るソフトウェア開発装置によれば、警告条件を満たす記述がソースコードにある場合、ソフトウェア開発者に警告を通知することができる。したがって、解析時間を増加させるような記述の是正をソフトウェア開発者に促すことにより、ソースコードの構成的課題を是正させることができる。
実施の形態1に係るソフトウェア開発装置の構成図。 実施の形態1に係るソフトウェア開発処理のフローチャート。 実施の形態1に係る警告条件の例を表す図。 実施の形態1に係るソースコードの例を表す図。 実施の形態1に係る構文解析結果の例を表す図。 実施の形態1に係る構文解析結果の例を表す図。 実施の形態1に係る関数リストの例を表す図。 実施の形態1に係るソースコードの例を表す図。 実施の形態1に係る関数リスト生成処理のフローチャート。 実施の形態1に係るアドレス渡し判定処理のフローチャート。 実施の形態1に係るアドレス参照確認表の例を表す図。 実施の形態1に係る階層カウント処理のフローチャート。 実施の形態1に係る関数ツリーの例を表す図。 実施の形態1の変形例に係るソフトウェア開発装置100の構成図。 実施の形態2に係るソフトウェア開発装置100aの構成図。 実施の形態3に係るソフトウェア開発装置100bの構成図。
以下、本発明の実施の形態について、図を用いて説明する。なお、各図中、同一または相当する部分には、同一符号を付している。実施の形態の説明において、同一または相当する部分については、説明を適宜省略または簡略化する。
実施の形態1.
***構成の説明***
図1を用いて、本実施の形態に係るソフトウェア開発装置100の構成を説明する。
本実施の形態に係るソフトウェア開発装置100は、ソフトウェア開発環境の機能を有する。
ソフトウェア開発装置100は、コンピュータである。ソフトウェア開発装置100は、プロセッサ910を備えるとともに、メモリ921、補助記憶装置922、入力インタフェース930、および出力インタフェース940といった他のハードウェアを備える。プロセッサ910は、信号線を介して他のハードウェアと接続され、これら他のハードウェアを制御する。
ソフトウェア開発装置100は、機能要素として、警告条件受付部110と、エディタ部120と、構文解析部130と、構造分析部140と、監視部150と、コンパイル部160と、記憶部170を備える。構造分析部140は、関数リスト生成部141と、アドレス渡し判定部142と、階層カウント部143とを備える。
記憶部170には、ソースコード20と、構文解析結果21と、関数リスト22と、関数ツリー23と、警告条件24と、アドレス参照確認表25が記憶されている。
警告条件受付部110とエディタ部120と構文解析部130と構造分析部140と監視部150とコンパイル部160の機能は、ソフトウェアにより実現される。構造分析部140の機能とは、上述したように、関数リスト生成部141とアドレス渡し判定部142と階層カウント部143の機能である。
記憶部170は、メモリ921に備えられる。
プロセッサ910は、ソフトウェア開発プログラムを実行する装置である。ソフトウェア開発プログラムは、警告条件受付部110とエディタ部120と構文解析部130と構造分析部140と監視部150とコンパイル部160の機能を実現するプログラムである。
プロセッサ910は、演算処理を行うIC(Integrated Circuit)である。プロセッサ910の具体例は、CPU(Central Processing Unit)、DSP(Digital Signal Processor)、GPU(Graphics Processing Unit)である。
メモリ921は、データを一時的に記憶する記憶装置である。メモリ921の具体例は、SRAM(Static Random Access Memory)、あるいはDRAM(Dynamic Random Access Memory)である。
補助記憶装置922は、データを保管する記憶装置である。補助記憶装置922の具体例は、HDDである。また、補助記憶装置922は、SD(登録商標)メモリカード、CF、NANDフラッシュ、フレキシブルディスク、光ディスク、コンパクトディスク、ブルーレイ(登録商標)ディスク、DVDといった可搬記憶媒体であってもよい。なお、HDDは、Hard Disk Driveの略語である。SD(登録商標)は、Secure Digitalの略語である。CFは、CompactFlash(登録商標)の略語である。DVDは、Digital Versatile Diskの略語である。
入力インタフェース930は、マウス、キーボード、あるいはタッチパネルといった入力装置と接続されるポートである。入力インタフェース930は、具体的には、USB(Universal Serial Bus)端子である。なお、入力インタフェース930は、LAN(Local Area Network)と接続されるポートであってもよい。
出力インタフェース940は、ディスプレイといった出力機器のケーブルが接続されるポートである。出力インタフェース940は、具体的には、USB端子またはHDMI(登録商標)(High Definition Multimedia Interface)端子である。ディスプレイは、具体的には、LCD(Liquid Crystal Display)である。
ソフトウェア開発プログラムは、プロセッサ910に読み込まれ、プロセッサ910によって実行される。メモリ921には、ソフトウェア開発プログラムだけでなく、OS(Operating System)も記憶されている。プロセッサ910は、OSを実行しながら、ソフトウェア開発プログラムを実行する。ソフトウェア開発プログラムおよびOSは、補助記憶装置922に記憶されていてもよい。補助記憶装置922に記憶されているソフトウェア開発プログラムおよびOSは、メモリ921にロードされ、プロセッサ910によって実行される。なお、ソフトウェア開発プログラムの一部または全部がOSに組み込まれていてもよい。
ソフトウェア開発装置100は、プロセッサ910を代替する複数のプロセッサを備えていてもよい。これら複数のプロセッサは、ソフトウェア開発プログラムの実行を分担する。それぞれのプロセッサは、プロセッサ910と同じように、ソフトウェア開発プログラムを実行する装置である。
ソフトウェア開発プログラムにより利用、処理または出力されるデータ、情報、信号値および変数値は、メモリ921、補助記憶装置922、または、プロセッサ910内のレジスタあるいはキャッシュメモリに記憶される。
警告条件受付部110とエディタ部120と構文解析部130と構造分析部140と監視部150とコンパイル部160の各部の「部」を「処理」、「手順」あるいは「工程」に読み替えてもよい。なお、コンパイル部160はコンパイラである。
ソフトウェア開発プログラムは、上記の各部の「部」を「処理」、「手順」あるいは「工程」に読み替えた各処理、各手順あるいは各工程を、コンピュータに実行させる。また、ソフトウェア開発方法は、ソフトウェア開発装置100がソフトウェア開発プログラムを実行することにより行われる方法である。
ソフトウェア開発プログラムは、コンピュータ読取可能な記録媒体に格納されて提供されてもよい。また、ソフトウェア開発プログラムは、プログラムプロダクトとして提供されてもよい。
***動作の説明***
図2を用いて、本実施の形態に係るソフトウェア開発処理S100について説明する。
まず、図3を用いて、本実施の形態に係る警告条件24の例について説明する。
警告条件受付部110は、入力インタフェース930を介して、ソフトウェア開発者といった利用者から、警告を通知する条件を受け付け、記憶部170に警告条件24として記憶する。警告を通知する条件は、引数のアドレス渡しの回数である。すなわち、警告条件受付部110は、引数のアドレス渡し回数を表す値N(自然数)を設定値として、警告条件24を受け付ける。図3の例では、警告条件受付部110は、引数のアドレス渡し回数を表す設定値「3」の入力を受け付け、警告条件24として記憶部170に記憶する。
また、図4は、本実施の形態に係るソースコード20の一例であるソースコード200を表す。ソースコード20は複数の関数を含む。なお、ソースコード20に含まれる関数は単数であっても本実施の形態を適用することができる。
エディタ部120は、入力インタフェース930を介して、利用者からソースコード200の編集を受け付ける。エディタ部120は、ソースコード200の編集の他に、ソースコード200の記憶部170への記憶、および、ソースコード200の記憶部170からの読出しを行う。
<構文解析処理:ステップS10>
ステップS10において、構文解析部130は、ソースコード20から複数の関数の関数同士の参照関係を構文解析結果21として取得する。具体的には、構文解析部130は、記憶部170に記憶されているソースコード20に対して、字句解析および構文解析を行い、構文解析結果21を生成する。
構文解析結果21は以下の情報を有する。
(1)関数名
(2)関数の仮引数名、仮引数の型
(3)関数の中で定義している変数名、変数の型
(4)変数同士の代入
(5)関数の中で使用している関数名、すなわち参照関数
(6)(5)の関数の実引数名
(7)大域変数の変数名、大域変数の型
構文解析部130は、構文解析結果21を記憶部170に記憶する。なお、構文解析結果21は上記(1)から(7)の情報を有していれば構造は問わない。
図5は、本実施の形態に係る構文解析結果21の例を表す図である。
図6は、本実施の形態に係る構文解析結果21の例を表す図である。
構文解析結果21は、図5および図6に示すように、リスト形式でも良い。図5および図6の構文解析結果21は図4のソースコード20をリスト化したものである。図5の構文解析結果_大域変数210は、大域変数をリスト化したものである。また、図6の構文解析結果_関数211,212は、関数をリスト化したものである。構文解析結果_大域変数210には上記(7)の情報が格納される。構文解析結果_関数211,212には上記(1)から(6)の情報が格納される。
図5および図6における(8)から(10)の情報は、構造分析部140による分析によって導出される項目である。よって、構文解析部130では導出されない。
(8)仮引数参照アドレスは(2−1)仮引数が示す変数のアドレスを表すものである。(9)実引数参照アドレスは、(6)実引数が示す変数のアドレスを表すものである。
(10)参照アドレスはグローバル変数が示すアドレスを表すものである。(8)から(9)の情報により、同じ関数であっても示すアドレスが異なる場合があるので、呼び出す関数1つにつき、構文解析結果_関数211,212のようなリストを1つずつ生成する。つまり、同じ関数が呼び出された場合においても、それぞれ構文解析結果_関数、すなわち関数の構文解析結果21を生成する。
<構造分析処理:S20>
ステップS20において、構造分析部140は、複数の関数を含むソースコード20を分析し、複数の関数のうち引数のアドレス渡しを行っている特定関数を抽出するとともに、特定関数が連続して引数のアドレス渡しを行っている連続回数を抽出する。構造分析部140は、構文解析結果21に基づいて、特定関数と連続回数とを抽出する。つまり、構造分析部140は、構文解析結果21に基づいて、引数のアドレス渡しを行っている関数と、その関数が連続して引数のアドレス渡しを行っている回数とを抽出する構造分析処理を行う。
構造分析処理は、関数リスト生成処理、アドレス渡し判定処理、および階層カウント処理を有する。
関数リスト生成処理において、関数リスト生成部141は、構文解析結果21に基づいて、複数の関数から参照関係にある関数同士を抽出し、参照関係にある関数同士を関数リスト22として生成する。
アドレス渡し判定処理において、アドレス渡し判定部142は、構文解析結果21を用いて参照関係がある関数同士から引数のアドレス渡しを行っている特定関数を判定する。そして、アドレス渡し判定部142は、特定関数が引数のアドレス渡し行っていることを表す情報を関数リスト22に付与する。
階層カウント処理において、階層カウント部143は、関数リスト22に基づいて、特定関数について連続して引数のアドレス渡しを行っている回数を連続回数としてカウントする。
図7は、本実施の形態に係る関数リスト22の例を表す図である。
図8は、本実施の形態に係るソースコード20の別例であるソースコード201,202,203,204,205,206を表す図である。
構造分析部140は、構文解析結果21から、図7に示すような関数リスト22を生成する。図7の関数リスト220は、関数同士の呼び出し関係をまとめたものである。図7の関数リスト221は関数同士の呼び出し関係に加え、引数のアドレス渡しを行っているかを表現したものである。関数リストの構成として、1行目に被参照関数、1列目に参照関数を記載し、2行2列目以降に参照関係を表す数値を記載する。ここでは参照していないことを「0」で表し、参照していることを「0以外の数値」で表している。関数リスト221の場合、参照していることを1、参照しており、かつ引数のアドレス渡しを行っていることを−1で表している。すなわち、−1が設定されている関数は、引数のアドレス渡し行っている特定関数である。また、−1を関数リストに設定することは、特定関数が引数のアドレス渡し行っていることを表す情報を関数リスト22に付与することである。
以下において、構造分析部140が備える関数リスト生成部141、アドレス渡し判定部142、および階層カウント部143の各々の動作について詳しく説明する。
<<関数リスト生成処理:ステップS21>>
図9は、本実施の形態に係る関数リスト生成処理のフローチャートである。
関数リスト生成部141は、関数リスト生成処理を行う。関数リスト生成部141は、構文解析結果21から(1)関数名と(5)参照関数を抽出し、関数リスト22を生成する。図7の関数リスト220は、図8のソースコードに基づいて生成されている。
ステップS101において、関数リスト生成部141は、構文解析結果21から(1)関数名と(5)参照関数の情報を抽出する。
ステップS102において、関数リスト生成部141は、図7の関数リスト220に示すように、ステップS101で抽出した全ての関数を1行目と1列目に並べる。
ステップS103において、関数リスト生成部141は、関数リスト220の2行2列目以降の数値部分を構文解析結果_関数の(5)参照関数に応じて入力する。関数リスト220の数値部分は、1列目の関数が2列目以降の関数を参照している場合1を格納し、参照していない場合は0を格納する。図8のソースコードを例にすると、ソースコード201ではmain関数はfuncAを参照しているので1、main関数はfuncA以外の関数を参照していないので0を格納する。
以上の処理で関数リスト220を生成する。
なお、ここで、図4および図8のソースコードについて簡単に説明する。
図4および図8のソースコードでは、説明を分かり易くするために、int型で宣言された変数については、「_val」を付しており、int*型で宣言されたポインタ型の変数については、「_addr」を付している。
「int* pa_addr」と宣言された場合、pa_addrはintのポインタ型であることを示す。また、int型で宣言された変数global_valについて、「&global_val」はglobal_valのアドレスを示す。
<<アドレス渡し判定処理:ステップS22>>
図10は、本実施の形態に係るアドレス渡し判定処理のフローチャートである。
アドレス渡し判定部142は、構文解析結果21を用いて、関数の中で引数のアドレス渡しを行っているかを確認する。アドレス渡し判定部142は、構文解析結果21に基づいて、複数の関数の各々の引数である変数が参照しているアドレスを設定したアドレス参照確認表25を生成する。そして、アドレス渡し判定部142は、アドレス参照確認表25に基づいて、引数のアドレス渡しを行っている特定関数を判定する。アドレス渡し判定部142は、判定結果に応じて関数リスト22の内容を更新する。引数のアドレス渡しの判定対象は関数リスト22内の全ての関数である。
引数のアドレス渡し判定処理の内容を図10のフローチャートと図4のソースコード200と図5の構文解析結果_大域変数と図6の構文解析結果_関数を例に説明する。
ステップS111において、アドレス渡し判定部142は、構文解析結果_関数211の(2−1)仮引数名および(2−2)仮引数の型を確認し、仮引数にポインタ記述が存在するか確認する。存在しない場合、処理を終了する。存在する場合はステップS112の処理を行う。
図11は、本実施の形態に係るアドレス参照確認表25の例を表す図である。
ステップS112において、アドレス渡し判定部142は、引数のアドレス渡しの有無を確認するため、図11に示すようなアドレス参照確認表25を生成する。アドレス参照確認表25は、変数がどの変数のアドレスを参照しているかを記憶するものである。まず、アドレス参照を確認する変数を列挙する。アドレス渡し判定部142は、構文解析結果_関数211の(2−1)仮引数名と(3−1)変数名を抽出し、アドレス参照確認表25の変数列に加える。アドレス渡し判定部142は、(2−1)仮引数名をアドレス参照確認表25に挿入する際には、アドレス参照確認表25の参照アドレス列に仮引数が示している変数のアドレスも入力する。
図4のソースコード200では、funcTestAを使用している関数を記載していないので仮引数pa_addrが示している変数のアドレスが定まらない。ここではfuncTestAの仮引数pa_addrが示しているアドレスをpint_valとして、後の処理を説明する。ここまでの処理を用いて構文解析結果_関数211に対して変数抽出を実施した場合、アドレス参照確認表511が生成できる。
ステップS113において、アドレス渡し判定部142は、アドレス参照確認表25に加えた変数のアドレス参照状態を確認する。アドレスの参照状態を確認するためには、構文解析結果_関数の(4)変数同士の代入を上から確認していく。図6の構文解析結果_関数211の場合、(4)変数同士の代入の一番上は「pb_addr=pa_addr」である。pb_addrとpa_addrの型を確認するため、構文解析結果_関数211の(2−1)仮引数名(2−2)仮引数の型(3−1)変数名(3−2)変数の型を探索する。変数pb_addrは構文解析結果_関数211の(3−1)変数名と(3−2)仮引数の型により「int*」であることが確認できる。また、変数pa_addrは(2−1)仮引数名と(2−2)仮引数により「int*」であることが確認できる。また、アドレス参照確認表25によって、pa_addrはpa_addrのアドレスを示していることが確認できる。よってpb_addr=pa_addrはpb_addrにpa_addrのアドレスを渡していることが確認できる。この場合、アドレス渡し判定部142は、アドレス参照確認表511の変数pb_addrの右枠にpint_valを格納する。格納した結果がアドレス参照確認表512である。
同様の処理を構文解析結果_関数211の(4)変数同士の代入の「pc_addr=pb_addr」にも実施する。実施した結果がアドレス参照確認表513である。
また、構文解析結果_関数211の(4)変数同士の代入の「*pc_addr=global_val」において、変数pc_addrは構文解析結果_関数211より「int*」であることが確認できる。変数global_valは構文解析結果_関数211には存在しない。その場合、変数の探索域を構文解析結果_大域変数210に変更する。構文解析結果_大域変数210で変数global_valは「int」であることが確認できる。よって*pc_addr=global_valはアドレス渡し、すなわちアドレスの代入ではなく、値渡し、すなわち値の代入であることが確認できる。値渡しの場合、アドレス参照確認表25の更新は行わない。
*pc_addr=global_valについてさらに説明する。pcはint型ポインタである。int型ポインタであるpcを「*pc」と記載した場合、参照されるのはpcのアドレスに格納された「値」である。global_valはint型なので、「global_val」と記載した場合、参照されるのはglobal_valに格納された「値」である。よって、これにより*pc_addr=global_valは、値同士の代入であることが確認できる。
ステップS114において、アドレス渡し判定部142は、アドレス参照確認表25で引数のアドレス参照判定を行う。構文解析結果_関数211の(6)実引数に記載されている変数が仮引数のアドレスを示している場合、引数のアドレス参照「有」と判定し、示していない場合は「無」と判定する。「有」と判定した場合、ステップS115の処理を行い、「無」の場合は処理を終了する。
図6の構文解析結果_関数211の場合、(6)実引数に記載されているのは変数pc_addrであり、アドレス参照確認表253によるとpc_addrが示しているアドレスはpint_valである。構文解析結果_関数211によると仮引数pa_addrが示しているアドレスもpint_valなので、funcTestAはfuncTestBに引数のアドレス渡しを行っていることが確認できる。よって、アドレス渡し判定部142は、「有」と判定する。実引数pc_addrが示しているアドレスがpint_valであることが確認できたので、構文解析結果_関数211の(9)実引数参照アドレスと構文解析結果_関数212の(8)仮引数参照アドレスにpint_valを入力する。
ステップS115において、アドレス渡し判定部142は、ステップS114で「有」と判定された関数の参照は関数リスト22において−1を格納する。図8のソースコードを対象に引数のアドレス渡し参照確認を行った結果が図9の関数リスト221である。関数同士の参照がない場合は「0」、アドレス渡し以外の参照は「1」、アドレス渡しを行った参照は「−1」を格納している。
以上の処理により、参照関数について引数のアドレス渡しを判定する。
<<階層カウント処理:ステップS23>>
図12は、本実施の形態に係る階層カウント処理のフローチャートである。
図13は、本実施の形態に係る関数ツリー23の例を表す図である。
階層カウント部143は、関数リスト22に基づいて、複数の関数の関数同士の参照関係をツリー構造で表現した関数ツリー23を生成する。そして、階層カウント部143は、関数ツリー23と構文解析結果21とに基づいて、関数ツリー23のノードとなる各関数の階層を連続回数としてカウントする。
階層カウント部143は、図13に示すように、関数参照をツリー構造で表現した関数ツリー23を生成し、関数ツリー23のノードとなる各関数に階層を設定する。階層カウント部143は、関数リスト22を基に関数ツリー23を生成する。階層カウント処理について、図12のフローチャートと図7の関数リスト221を用いて説明する。
ステップS131において、階層カウント部143は、関数リスト221の2行目の関数を参照関係確認関数に指定する。関数リスト221において2行目の関数はmainであるので、mainが参照関係確認関数として指定される。
ステップS132において、階層カウント部143は、参照関係確認関数に指定された関数を関数ツリーの要素として配置する。ここでの「配置」とは関数ツリーの各要素を区別できるような位置情報を振ることを意味する。具体的には、2次元空間上の座標情報を位置情報とし、2次元における横情報をX、縦情報をYとし、座標情報を(X、Y)と表現とする場合、(0、4)あるいは(−1、0)といった情報を参照関係確認関数に振り、2次元空間上に存在する要素同士を区別できるようにする。上記の例は一例であり、関数ツリーという情報を表現できれば位置情報の振り方は問わない。
ステップS133において、階層カウント部143は、関数ツリー上において参照関係にある要素同士を線で結ぶ処理を行う。結ぶ対象は、参照関係確認関数と一つ前の再帰で関数ツリー23に配置した要素である。「一つ前の再帰で関数ツリー23に配置した要素」とは参照関係確認関数を参照している関数を表す。例えば、関数リスト221のfuncAを参照関係確認関数とした場合、funcAを参照しているのはmainであるので、funcAとmainを図13の関数ツリー23のように線で接続する。
ステップS134において、階層カウント部143は、参照関係確認関数がアドレス渡しを行っているかを確認する。アドレス渡しを行っているかを確認するには、関数リスト221における参照関係確認関数の行に「−1」が存在しないかを確認する。確認した結果、引数のアドレス渡しが存在する場合はステップS135の処理を行う。存在しない場合はステップS136の処理を行う。具体的には、参照関係確認関数がfuncAの場合、関数リスト221においてfuncAは3行目であり、3行目には「−1」が存在するので、ステップS135の処理を実行する。
ステップS135において、階層カウント部143は、関数ツリー上の参照関係確認関数に階層値を振る。階層値の値は「階層=同じアドレスを渡した回数」とする。「同じアドレスを渡した回数」とは、構文解析結果_関数において、(8)仮引数参照アドレスと(9)実引数参照アドレスが同じである回数を示す。具体的には、図6の構文解析結果_関数211の場合、(8)仮引数参照アドレスと(9)実引数参照アドレスが同じなので1階層目とする。funcTestAが参照しているfuncTestBの(8)仮引数参照アドレスと(9)実引数参照アドレスがfuncTestAと同様であるならばfuncTestBを2階層目とする。以下同様に同じアドレスを渡した回数をカウントし、階層値とする。なお引数が複数あり、異なる引数でアドレスを連続して渡している場合は、連続してアドレス渡している回数が最も大きいものを階層値とする。具体的には、引数1で渡されているアドレスは3回連続で渡されており、引数2で渡されているアドレスは4回連続である場合には、4を階層値とする。
ステップS136において、階層カウント部143は、関数ツリー上の参照関係確認関数に階層値を振る。階層値の初期値は「階層=0」とする。
ステップS137において、階層カウント部143は、参照関係確認関数が参照している関数がないか関数リスト22で確認する。参照している関数がある場合、階層カウント部143は、参照している関数ごとにステップS138の処理を実行する。参照している関数がない場合、階層カウント処理を終了する。参照関係確認関数をfuncAとした場合、funcAは関数リスト221によるとfuncB、funcC、funcDを参照しているので、参照しているそれぞれの関数に対してステップS138の処理を行う。ステップS138の処理を行う順番は問わないものとする。なお、図12のフローチャートには関数リストの左列から右列に向かって参照関数の有無を確認するアルゴリズムを記載しているが、すべての関数の参照関係を確認できるのであれば方法は問わない。
ステップS138において、階層カウント部143は、参照関係確認関数が参照している関数を参照関係確認関数としてステップS130からステップS139の処理を実施する。実施が完了したら、参照関係確認関数を元の関数に戻し、ステップS139の処理を実施する。具体的には、参照関係確認関数をfuncAとした場合、funcAはfuncB、funcC、funcDを参照しているので、funcB、funcC、funcDを参照関係確認関数としてステップS130からステップS139を実施する。funcB、funcC、funcDに対してステップS130からステップS139の処理をそれぞれ実施したら、参照関係確認関数をfuncAに戻し、階層カウント処理終了する。
以上の処理により、図13のような関数ツリー23を生成する。階層カウント部143は、生成した関数ツリー23を記憶部170に記憶する。
ここで、構造分析部140が、無限に階層をカウントさせる複数の関数の構造を検出し、無限カウントを防止する処理について説明する。階層カウント処理において、構造的に無限に階層をカウントしてしまう関数呼び出しについて、無限カウントを防止する。無限に階層をカウントする関数呼び出しとは、具体的には、「funcA→funcB→funcC→funcA→funcB→…」のようなものである。funcCがfuncAを呼び出しているので、無限に「funcA→funcB→funcC」のループが行われる。これを防止するために、階層カウント処理対象である参照関係確認関数を記憶し、記憶した中に同じ関数が存在する場合、処理を終了するという処理を加える。下記に処理の例を説明する。
図12のステップS131に処理を追加したものをステップS131Aとし、ステップS139に処理を加えたものをステップS139Aとする。なお、参照関係確認関数を記憶するデータ構造はスタックとする。
ステップS131Aにおいて、階層カウント部143は、参照関係確認関数を指定する。階層カウント部143は、参照関係確認関数をデータ記憶領域にプッシュする。参照関係確認関数と同じ関数が存在する場合、ステップS139Aの処理を行う。
ステップS139Aにおいて、階層カウント部143は、ステップS131Aで追加した参照関係確認関数をポップする。
上記のような処理を加えた上で、「funcA→funcB→funcC→funcA→funcB→…」のような構造を処理すると2回目のfuncAで階層カウント処理を中断することができる。
以上のような処理で無限階層カウントを防止する。
<監視処理:S30>
ステップS30において、監視部150は、連続回数が、特定関数により引数のアドレス渡しが行われていることを警告するための警告条件24を満たすか否かを監視する。そして、監視部150は、連続回数が警告条件24を満たす場合に、特定関数により引数のアドレス渡しが行われていることを警告する警告情報30を出力する。
具体的には、監視部150は、利用者が設定した警告条件と関数ツリーの中に条件が一致しているものがないか確認する。監視処理は条件一致確認処理ともいう。また、監視部150は、警告条件24と一致している場合は警告情報30を出力する。図3の警告条件24と、図13の関数ツリー23を例に説明する。警告条件24には、「引数のアドレス渡しを3回連続して行った関数を特定関数として検知する」ことが設定されている。図13の関数ツリー23では、引数のアドレス渡しを3回連続行っているのはmainから辿って、funcA、funcC、を経由したfuncBである。よって、監視部150は、funcBを特定関数とする。監視部150は、警告条件24に条件が一致するプログラムを検知すると、出力インタフェース940を介して、ディスプレイといった表示機器に警告情報30を出力する。これにより、警告情報30が利用者に通知される。
以上の説明により、本実施の形態では、引数のアドレス渡しを特定の記述として、N回数以上連続してアドレス渡しが行われたことを警告するソフトウェア開発装置100を実現する。
***他の構成***
<変形例1>
本実施の形態では、表示機器に警告情報を出力している。しかし、利用者が容易に条件一致を確認できるように、表示機器に記憶部170に記憶された関数ツリー23を表示してもよい。また、監視部がN回以上の引数のアドレス渡しを検知した場合、警告をポップアップ表示する、あるいは、関数ツリー要素、すなわち特定関数を強調表示してもよい。その他、利用者が容易に特定関数を確認できるような表示であれば、表示方法は問わない。
以上により、利用者が容易に警告条件一致を確認できるようになる。
<変形例2>
ソフトウェア開発装置100がネットワークを介して他の装置と通信する通信装置を備えていてもよい。通信装置は、レシーバとトランスミッタを有する。通信装置は、有線または無線で、LAN、インターネット、あるいは電話回線といった通信網に接続している。通信装置は、具体的には、通信チップまたはNIC(Network Interface Card)である。ソフトウェア開発装置100は、通信装置を介して、外部の装置から警告条件あるいはソースコードを受信してもよい。あるいは、ソフトウェア開発装置100は、通信装置を介して、警告情報を外部の装置に送信してもよい。
<変形例3>
本実施の形態では、警告条件受付部110とエディタ部120と構文解析部130と構造分析部140と監視部150とコンパイル部160の機能がソフトウェアで実現される。変形例として、警告条件受付部110とエディタ部120と構文解析部130と構造分析部140と監視部150とコンパイル部160の機能がハードウェアで実現されてもよい。
図14は、本実施の形態の変形例に係るソフトウェア開発装置100の構成を示す図である。
ソフトウェア開発装置100は、電子回路909、メモリ921、補助記憶装置922、入力インタフェース930、および出力インタフェース940を備える。
電子回路909は、警告条件受付部110とエディタ部120と構文解析部130と構造分析部140と監視部150とコンパイル部160の機能を実現する専用の電子回路である。
電子回路909は、具体的には、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ロジックIC、GA、ASIC、または、FPGAである。GAは、Gate Arrayの略語である。ASICは、Application Specific Integrated Circuitの略語である。FPGAは、Field−Programmable Gate Arrayの略語である。
警告条件受付部110とエディタ部120と構文解析部130と構造分析部140と監視部150とコンパイル部160の機能は、1つの電子回路で実現されてもよいし、複数の電子回路に分散して実現されてもよい。
別の変形例として、警告条件受付部110とエディタ部120と構文解析部130と構造分析部140と監視部150とコンパイル部160の一部の機能が電子回路で実現され、残りの機能がソフトウェアで実現されてもよい。
プロセッサと電子回路の各々は、プロセッシングサーキットリとも呼ばれる。つまり、ソフトウェア開発装置100において、警告条件受付部110とエディタ部120と構文解析部130と構造分析部140と監視部150とコンパイル部160の機能は、プロセッシングサーキットリにより実現される。
ソフトウェア開発装置100において、警告条件受付部、構文解析部、構造分析部、および監視部の「部」を「工程」あるいは「処理」に読み替えてもよい。また、警告条件受付処理、構文解析処理、構造分析処理、および監視処理の「処理」を「プログラム」、「プログラムプロダクト」または「プログラムを記録したコンピュータ読取可能な記憶媒体」に読み替えてもよい。
***本実施の形態の効果の説明***
本実施の形態に係るソフトウェア開発装置100は、静的解析時間を増加させる記述を引数のアドレス渡しとし、ソースコードに含まれる引数のアドレス渡しを行っている関数を抽出する。また、N階層以上連続してアドレス渡しを行っている関数を特定関数とし、利用者に特定関数の是正を通達することで、静的解析時間の増加を抑制する。よって、本実施の形態に係るソフトウェア開発装置100によれば、静的解析ツールの解析時間増加を抑制することができる。
また、本実施の形態に係るソフトウェア開発装置100によれば、アドレス渡しの階層カウントにおいて、無限に階層をカウントさせる構造を持つ単数および複数の関数の構造的特長を検出し、無限カウントを防止することができる。
実施の形態2.
本実施の形態では、主に、実施の形態1と異なる点について説明する。なお、実施の形態1で説明した構成と同様の構成について同一の符号を付し、その説明を省略する。
図15を用いて、本実施の形態に係るソフトウェア開発装置100aの構成を説明する。
本実施の形態に係るソフトウェア開発装置100aは、実施の形態1の構成に加え、是正強制部180を備える。是正強制部180は、利用者にソースコードの是正を強制できる機能を有する。是正強制部180は、警告条件24を満たしてしまうソースコード記述がある場合に利用者にソースコードの是正を強制させる。是正を強制させるために、具体的には、新たな関数の実装をさせなくすること、あるいは、コンパイルを実行できなくすることといった機能が挙げられる。
本実施の形態では、ソフトウェア開発装置100は、監視部150が警告情報30を出力すると、警告情報30が解消されるまでソースコードのコンパイルを制限する制限部181を備えている。ソースコードの編集を停止させる機能の例として。是正強制部180は制限部181を備える。制限部181は監視部150の警告情報に基づいて、コンパイル部160を起動あるいは停止させる機能を有する。監視部150が警告条件24の一致を検知した場合、制限部181は検知情報を受け取り、コンパイル部160を停止する。利用者がソースコードを修正し、監視部150からの検知情報が失われた場合、制限部181はコンパイル部160を起動する。
以上により、利用者にソースコードの是正を強制することができる。
実施の形態3.
本実施の形態では、主に、実施の形態1と異なる点について説明する。なお、実施の形態1で説明した構成と同様の構成について同一の符号を付し、その説明を省略する。
図16を用いて、本実施の形態に係るソフトウェア開発装置100bの構成を説明する。
本実施の形態に係るソフトウェア開発装置100bは、実施の形態1の構成に加え、一時保管部190を備える。一時保管部190は、エディタ部により編集されているソースコードを一時的に保管し、利用者のソースコード編集と並行して警告出力を行えるようにする。上述した実施の形態1および2では、利用者がソースコードを記憶部170に保存しない限り、解析対象が記憶部170に存在しないので、解析を始めることができなかった。そこで、本実施の形態では、一時保管部190を追加し、エディタ部120が特定のタイミングでソースコードを保存することで、利用者が意図せずとも解析対象を確保することができ、ソースコード解析から警告出力を行えるようにする。
一時保管部190は利用者がエディタ部120で編集中のソースコードを一時的保存する記憶媒体である。図16では、一時保管部190は、メモリ921において記憶部170とは異なるエリアに設けられている。一時保管部190で扱う記憶媒体はソースコードを一時保存できる記憶媒体であれば、種類は問わない。具体的には、RAMでも良いし、HDDでも良い。
また、エディタ部120が一時保管部190に保存するタイミングは問わない。具体的には、一定周期でも良いし、利用者によりキーボードの改行を打った時でも良い。
構文解析部130は、一時保管部190に保管されているソースコードから構文解析結果21を取得する。構文解析部130は、一時保管部190に存在するソースコードを解析し、構造分析部140は構文解析の解析が終了し次第、即座に構文解析結果21を分析する。また、監視部150は構造分析部140の分析が終了し次第、即座に分析結果と条件を比較し、条件一致を検出する。
以上により、利用者のソースコード編集と並行して警告出力を行えるようにする。
本実施の形態では、ソフトウェア開発装置の各部を独立した機能ブロックとして説明した。しかし、ソフトウェア開発装置の構成は、上述した実施の形態のような構成でなくてもよい。ソフトウェア開発装置の機能ブロックは、上述した実施の形態で説明した機能を実現することができれば、どのような構成でもよい。
実施の形態1から3のうち、複数の部分を組み合わせて実施しても構わない。あるいは、これらの実施の形態のうち、1つの部分を実施しても構わない。その他、これらの実施の形態を、全体としてあるいは部分的に、どのように組み合わせて実施しても構わない。
なお、上述した実施の形態は、本質的に好ましい例示であって、本発明の範囲、本発明の適用物の範囲、および本発明の用途の範囲を制限することを意図するものではない。上述した実施の形態は、必要に応じて種々の変更が可能である。
20,191,200,201,202,203,204,205,206 ソースコード、21 構文解析結果、210 構文解析結果_大域変数、211,212 構文解析結果_関数、22,220,221 関数リスト、23 関数ツリー、24 警告条件、25,511,512,513 アドレス参照確認表、30 警告情報、100,100a,100b ソフトウェア開発装置、110 警告条件受付部、120 エディタ部、130 構文解析部、140 構造分析部、141 関数リスト生成部、142 アドレス渡し判定部、143 階層カウント部、150 監視部、160 コンパイル部、170 記憶部、180 是正強制部、181 制限部、190 一時保管部、909 電子回路、910 プロセッサ、921 メモリ、922 補助記憶装置、930 入力インタフェース、940 出力インタフェース、S100 ソフトウェア開発処理。

Claims (11)

  1. 複数の関数を含むソースコードを分析し、前記複数の関数のうち引数のアドレス渡しを行っている特定関数を抽出するとともに、前記特定関数が連続して引数のアドレス渡しを行っている連続回数を抽出する構造分析部と、
    前記連続回数が、前記特定関数により引数のアドレス渡しが行われていることを警告するための警告条件を満たすか否かを監視し、前記連続回数が前記警告条件を満たす場合に、前記特定関数により引数のアドレス渡しが行われていることを警告する警告情報を出力する監視部と
    を備えたソフトウェア開発装置。
  2. 前記ソフトウェア開発装置は、
    前記ソースコードから前記複数の関数の関数同士の参照関係を構文解析結果として取得する構文解析部を備え、
    前記構造分析部は、
    前記構文解析結果に基づいて、前記特定関数と前記連続回数とを抽出する請求項1に記載のソフトウェア開発装置。
  3. 前記構造分析部は、
    前記構文解析結果に基づいて、前記複数の関数から参照関係にある関数同士を抽出し、前記参照関係にある関数同士を関数リストとして生成する関数リスト生成部と、
    前記構文解析結果を用いて前記参照関係がある関数同士から引数のアドレス渡しを行っている前記特定関数を判定し、前記特定関数が引数のアドレス渡し行っていることを表す情報を前記関数リストに付与するアドレス渡し判定部と、
    前記関数リストに基づいて、前記特定関数について連続して引数のアドレス渡しを行っている回数を前記連続回数としてカウントする階層カウント部と
    を備えた請求項2に記載のソフトウェア開発装置。
  4. 前記アドレス渡し判定部は、
    前記構文解析結果に基づいて、前記複数の関数の各々の引数である変数が参照しているアドレスを設定したアドレス参照確認表を生成し、前記アドレス参照確認表に基づいて前記特定関数を判定する請求項3に記載のソフトウェア開発装置。
  5. 前記階層カウント部は、
    前記関数リストに基づいて、前記複数の関数の関数同士の参照関係をツリー構造で表現した関数ツリーを生成し、前記関数ツリーと前記構文解析結果とに基づいて、前記関数ツリーのノードとなる各関数の階層を前記連続回数としてカウントする請求項4に記載のソフトウェア開発装置。
  6. 前記構造分析部は、無限に階層をカウントさせる前記複数の関数の構造を検出し、無限カウントを防止する請求項5に記載のソフトウェア開発装置。
  7. 前記ソフトウェア開発装置は、前記ソースコードの編集を受け付けるエディタ部と、前記エディタ部により編集されている前記ソースコードを一時的に保管する一時保管部とを備え、
    前記構文解析部は、前記一時保管部に保管されているソースコードから前記構文解析結果を取得する請求項2から6のいずれか1項に記載のソフトウェア開発装置。
  8. 前記ソフトウェア開発装置は、表示機器を備え、
    監視部は、前記警告情報を前記表示機器に表示する請求項1から7のいずれか1項に記載のソフトウェア開発装置。
  9. 前記ソフトウェア開発装置は、前記監視部が前記警告情報を出力すると、前記警告情報が解消されるまで前記ソースコードのコンパイルを制限する制限部を備えた請求項1から8のいずれか1項に記載のソフトウェア開発装置。
  10. 構造分析部が、複数の関数を含むソースコードを分析し、前記複数の関数のうち引数のアドレス渡しを行っている特定関数を抽出するとともに、前記特定関数が連続して引数のアドレス渡しを行っている連続回数を抽出し、
    監視部が、前記連続回数が、前記特定関数により引数のアドレス渡しが行われていることを警告するための警告条件を満たすか否かを監視し、前記連続回数が前記警告条件を満たす場合に、前記特定関数により引数のアドレス渡しが行われていることを警告する警告情報を出力するソフトウェア開発方法。
  11. 複数の関数を含むソースコードを分析し、前記複数の関数のうち引数のアドレス渡しを行っている特定関数を抽出するとともに、前記特定関数が連続して引数のアドレス渡しを行っている連続回数を抽出する構造分析処理と、
    前記連続回数が、前記特定関数により引数のアドレス渡しが行われていることを警告するための警告条件を満たすか否かを監視し、前記連続回数が前記警告条件を満たす場合に、前記特定関数により引数のアドレス渡しが行われていることを警告する警告情報を出力する監視処理と
    をコンピュータに実行させるソフトウェア開発プログラム。
JP2017241318A 2017-12-18 2017-12-18 ソフトウェア開発装置、ソフトウェア開発方法およびソフトウェア開発プログラム Active JP6945434B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2017241318A JP6945434B2 (ja) 2017-12-18 2017-12-18 ソフトウェア開発装置、ソフトウェア開発方法およびソフトウェア開発プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2017241318A JP6945434B2 (ja) 2017-12-18 2017-12-18 ソフトウェア開発装置、ソフトウェア開発方法およびソフトウェア開発プログラム

Publications (2)

Publication Number Publication Date
JP2019109639A JP2019109639A (ja) 2019-07-04
JP6945434B2 true JP6945434B2 (ja) 2021-10-06

Family

ID=67179822

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2017241318A Active JP6945434B2 (ja) 2017-12-18 2017-12-18 ソフトウェア開発装置、ソフトウェア開発方法およびソフトウェア開発プログラム

Country Status (1)

Country Link
JP (1) JP6945434B2 (ja)

Also Published As

Publication number Publication date
JP2019109639A (ja) 2019-07-04

Similar Documents

Publication Publication Date Title
US11740876B2 (en) Method and system for arbitrary-granularity execution clone detection
US9256517B1 (en) Display of aggregated stack traces in a source code viewer
JP4148527B2 (ja) 機能テスト・スクリプト生成装置
US8370816B2 (en) Device, method and computer program product for evaluating a debugger script
US9262132B1 (en) Incremental local source code analysis
CN108304175B (zh) 代码文件隔离打包方法及装置
US9424163B2 (en) Exception and debugging behaviors for JavaScript debugging using just my code
JP2006185211A (ja) プログラム解析装置、テスト実行装置、その解析方法及びプログラム
CN111124479B (zh) 配置文件的解析方法、系统及电子设备
WO2018161509A1 (zh) 条件编译预处理方法、终端及存储介质
WO2019055378A1 (en) METHOD AND APPARATUS FOR FINDING LONG PROCESSES IN A CODE
US20130179867A1 (en) Program Code Analysis System
US9311077B2 (en) Identification of code changes using language syntax and changeset data
JP5303795B2 (ja) アプリケーションの解析方法、解析システム及び解析プログラム
JP2009129127A (ja) プログラムの不変物抽出処理プログラム,処理装置,および処理方法,ならびに該プログラムを記憶する記憶媒体
JP2018169693A (ja) 情報処理装置、情報処理方法および情報処理プログラム
US8578323B2 (en) Hierarchical program source management
JP6107455B2 (ja) テストスケジュール決定装置、プログラム
JP6945434B2 (ja) ソフトウェア開発装置、ソフトウェア開発方法およびソフトウェア開発プログラム
US8291389B2 (en) Automatically detecting non-modifying transforms when profiling source code
JP5024252B2 (ja) トレース情報取得装置、トレース情報取得プログラム、および、トレース情報取得方法
CN113190235A (zh) 一种代码的分析方法、装置、电子终端及存储介质
JP2017151594A (ja) 支援装置、支援方法及びプログラム
CN113076084A (zh) 资源文件处理方法、装置、设备及存储介质
US20140149970A1 (en) Optimising a compilation parser for parsing computer program code in arbitrary applications

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20200914

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20210721

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20210817

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20210914

R150 Certificate of patent or registration of utility model

Ref document number: 6945434

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150