(toppers-users 4580) Re: cfg/pass1.rbでの空行の扱い

Hiroaki TAKADA hiro @ ertl.jp
2016年 7月 21日 (木) 08:08:00 JST


加藤様
Cc: 皆様

不具合の報告,ありがとうございます。

値取得シンボルテーブルは,ポーティングする人が記述するファイルで,
一般のユーザが記述するファイルではないものですから,エラー処理を
まじめにやっていませんでした。

お送り下さった修正案を参考に修正を検討したいと思いますし(変数名
の間違いは明らかな不具合ですね)。

高田広章
名古屋大学

(16/07/20 23:59), Takeharu KATO wrote:
> 加藤と申します。
> 
> 初めてメールさせていただきます。
> 
> TOPPERS/ASP3のコンフィグレータでの値取得シンボルテーブルに空行があった場合、
> コンフィグレータが異常終了する問題(?)を検出しましたのでご報告いたします。
> 
> つきましては、修正案を提出させていただきますので、空行を含むシンボルテーブル
> ファイルを扱えるように修正をお願できませんでしょうか?
> 
> 現象を確認したコンフィグレータのバージョンは, TOPPERS第3世代カーネル向け
> Ruby版コンフィギュレータ(cfg)1.2.1になります。
> 
> [現象]
> コンフィグレータの値取得シンボルテーブル(arch/arm_gcc/common/core_sym.defなど)
> に空行があった場合, カーネルのコンパイル時にコンフィグレータが以下の
> エラーメッセージとともに異常終了します(ファイルパス中のユーザディレクトリ名
> 部分は削除しています)。
> 
> asp3/cfg/pass1.rb:174:in `block (2 levels) in ReadSymvalTable': undefined local variable or method `fileName' for main:Object (NameError)
>          from /usr/share/ruby/csv.rb:1719:in `each'
>          from cfg/pass1.rb:171:in `block in ReadSymvalTable'
>          from cfg/pass1.rb:164:in `each'
>          from cfg/pass1.rb:164:in `ReadSymvalTable'
>          from cfg/pass1.rb:864:in `Pass1'
>          from ../cfg/cfg.rb:686:in `<main>'
> make[1]: *** [cfg1_out.timestamp] エラー 1
> 
> [再現手順]
> カーネルコンパイル時に以下の1), 2)の手順を実施する
> 
> 1) arch/arm_gcc/common/core_sym.defなどの値取得シンボルテーブル中に空行を含める
> 2) make clean; make を実行する
> 
> [原因]
> cfg/pass1.rb 174行目の ReadSymvalTable関数内のエラー終了処理(error_exit)呼出部分から
> 参照する変数の名前が誤っていた。
> 
> 誤: fileName
> 正: symvalTableFileName
> 
> [対処案]
> 以下の修正により, 空行や一般的なCSVコメント行(#で開始される行)を含むシンボルテーブルを
> 読み込んだ場合, 空行やコメント行を読み飛ばすようにする。
> 
> 1) cfg/pass1.rb 174行目の ReadSymvalTable関数内のエラー終了処理から参照される変数名を
>     修正
> 
> かつ
> 
> 2) シンボルテーブルファイルをオープンする際に, ブランク行の読み飛ばし指示とコメント行定義を
>     付与してファイルを開くよう修正する
> 
> [修正パッチ案]
> 上記対処案にしたがった修正案を以下に示します。
> 
> diff --git a/cfg/pass1.rb b/cfg/pass1.rb
> index 141c7f5..9332b58 100644
> --- a/cfg/pass1.rb
> +++ b/cfg/pass1.rb
> @@ -167,11 +167,11 @@ def ReadSymvalTable
>         next
>       end
> 
> -    symvalCsv = CSV.open(symvalTableFileName)
> +    symvalCsv = CSV.open(symvalTableFileName, {skip_blanks: true, skip_lines: /^#/})
>       symvalCsv.each do |record|
>         # 変数名
>         if record[0].nil?
> -        error_exit("invalid variable name in `#{fileName}'")
> +        error_exit("invalid variable name in ``#{symvalTableFileName}' at line: #{$.}")
>         end
> 
>         symbol = {}
>     
> 
> 以上、ご検討いただきますようよろしくお願いいたします。
>