comparison paper/chapter/04-interface.tex @ 81:9974be9e2d1c

add arg
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 05 Feb 2021 09:22:30 +0900
parents 3022da6f729f
children 3fb7c17d8e91
comparison
equal deleted inserted replaced
80:a15db66cab3c 81:9974be9e2d1c
250 generate\_stub.plを通すと、次の継続はgoto metaに変換されてしまい、引数情報が抜けてしまう。 250 generate\_stub.plを通すと、次の継続はgoto metaに変換されてしまい、引数情報が抜けてしまう。
251 その為引数はすべて適切にcontextに書き込まれている必要があるが、 一部引数が足りず書き込みが出来なかったケースでも、 CbCコンパイラレベルでは引数関係のエラーが発生しない。 251 その為引数はすべて適切にcontextに書き込まれている必要があるが、 一部引数が足りず書き込みが出来なかったケースでも、 CbCコンパイラレベルでは引数関係のエラーが発生しない。
252 また上手くInterfaceの入力の数を取得できなかった場合も、generate\_stub.plは止まらずにマクロを生成してしまう。 252 また上手くInterfaceの入力の数を取得できなかった場合も、generate\_stub.plは止まらずにマクロを生成してしまう。
253 Gearefを通してcontextに書き込む右辺値が抜けているコードなどがよく発生した。 253 Gearefを通してcontextに書き込む右辺値が抜けているコードなどがよく発生した。
254 この場合は原因を.cファイルと.cbcファイル、Interfaceファイル、contextファイルのすべてを確認しなければならず、デバッグが非常に困難だった。 254 この場合は原因を.cファイルと.cbcファイル、Interfaceファイル、contextファイルのすべてを確認しなければならず、デバッグが非常に困難だった。
255 255 InterfaceのAPI呼び出し時の引数検知は、 Interfaceの型定義ファイルからCodeGearの入力の数の取得が不十分であるのが主な原因であった。
256 また、従来のgenerate\_stub.plでは、引数処理の際に、CodeGearのAPIの引数が揃っていない場合でも、エラーは出さずに変換を行ってしまっていた。 256
257 これはPerlの構造上の問題も含まれるが、 Interfaceの型定義ファイルからCodeGearの入力の数の取得が不十分であるのが主な原因であった。 257
258 258 この問題はPerlスクリプトレベルで引数のチェックを十分に行う必要がある。
259 259 すでにInterfaceのパーサーは実装している為、 パーサー経由で呼び出しているAPIを持つInterfaceの情報を取得する。
260 パースした結果の情報に、 各CodeGearの引数情報と引数の数を取得できれば、それらとAPI呼び出し時に与えられている引数を比較すればチェックが可能である。
261 現状は引数の数が揃っているかどうかで確認をしている。
262
263 Intefaceの引数を確認し、Gearefマクロを生成しているgenerate\_stub.plの箇所に、引数の確認処理を実装した。(ソースコード\ref{src:parsedArgs})
264 ここでAPI呼び出し時の引数は、\texttt{\$tmpArgs}に代入されている。
265 CbCの関数呼び出しの引数はカンマで区切るので、2行目でカンマで文字列を分割し、引数を配列\texttt{@args}に変換している。
266
267 generate\_stub.plはローカル変数のすべての型を記録しているので、6行目でAPI呼び出しをしているインスタンスの名前からInterfaceを特定する。
268 特定後、ヘッダファイルの場所を取得し、8行目でInterfaceのパーサーを呼び出している。
269 パーサーから取得した情報から、メソッドの引数の数を14行目で取得し、 引数が格納されている配列\texttt{@args}の要素数と比較している。
260 \lstinputlisting[label=src:parsedArgs, caption=Perlレベルでの引数チェック]{src/parsedArgs.pl} 270 \lstinputlisting[label=src:parsedArgs, caption=Perlレベルでの引数チェック]{src/parsedArgs.pl}
261 271
262 現状は簡易的に引数の数でチェックしている。 272 Perlスクリプトでエラーを検知すると、 エラーで終了する。
273 ソースコード\ref{src:StackTestArg}のInterfaceの\texttt{insertTest1}を呼び出す例題でエラーを発生さる。
274 \lstinputlisting[label=src:StackTestArg, caption=StackTestInterfaceの定義]{src/StackTestArg.h}
275 ソースコード\ref{src:StackTestArgCbC}でAPIを呼び出しているが、 この呼び出し方法では\texttt{stack}が引数にない。
276 \lstinputlisting[label=src:StackTestArgCbC, caption=StackTestInterfaceのAPI呼び出し(引数不足)]{src/StackTestArg.cbc}
277 GearsOSのビルドを行うと、ソースコード\ref{src:argErr}のエラーが発生し、以降のビルドが停止する。
278 Cmakeはエラーを検知するとビルドを止めるようにMakefileを作製するため、 GearsOSの拡張構文のレベルで停止ができる。
279 \lstinputlisting[label=src:argErr, caption=InterfaceのAPI呼び出し時の引数エラー]{src/argError.txt}
280
263 generate\_stub.pl側で、出てきたローカル変数と型の組はすべて保存している。 281 generate\_stub.pl側で、出てきたローカル変数と型の組はすべて保存している。
264 Interface側のCodeGearの定義にも当然引数の型と名前は書かれている。 282 Interface側のCodeGearの定義にも当然引数の型と名前は書かれている。
265 このローカル変数の型と、CodeGearの定義の引数の型が、完全に一致しているかどうかのチェックを行うと、さらに強固な引数チェックが可能となる。 283 このローカル変数の型と、CodeGearの定義の引数の型が、完全に一致しているかどうかのチェックを行うと、さらに強固な引数チェックが可能となる。
266 ただし引数で渡す際に、例えばint型の値の加算処理などを行っていると、その処理の結果がint型になっているかどうかをPerlレベルでチェックする必要が出てしまう。 284 ただし引数で渡す際に、例えばint型の値の加算処理などを行っていると、その処理の結果がint型になっているかどうかをPerlレベルでチェックする必要が出てしまう。
267 285
286
268 \section{InterfaceのAPIの未実装の検知} 287 \section{InterfaceのAPIの未実装の検知}
288 パースした結果、ヘッダファイルにAPIの定義がなかった場合は11行目の\texttt{unless}に処理が落ち、 エラー終了する。
269 289
270 \section{par goto のInterface経由の呼び出しの対応} 290 \section{par goto のInterface経由の呼び出しの対応}