[HOME]  [リストへもどる]
一括表示

  Tra_TAG.def のバグ - konno 18/12/02-00:00 No.8632
  ┗ Re: Tra_TAG.def のバグ - としき 18/12/02-11:54 No.8633
   ┗ Re^2: Tra_TAG.def のバグ - konno 18/12/02-17:52 No.8634
    ┗ Re^3: Tra_TAG.def のバグ - konno 18/12/02-23:44 No.8635
     ┗ Tra_TAG.def 改 k04 - konno 18/12/04-23:17 No.8636
      ┗ Tra_TAG.def 改 k05 - konno 18/12/25-03:13 No.8637

(8632) 8632Tra_TAG.def のバグ  投稿者:konno   2018/12/02(日) 00:00
   コメント数 1

使用中の Tra_TAG.def に、致命的なバグがありました。(>_<)

WEBデータなどでは、1行の長さがとても長く改行の無い文章がありますが
Grep で検索したワードの一覧でも長いものがあり、これを Tra_TAG.def で
タグジャンプしたら、マクロ領域を壊して、VTDOSが落ちました。

オリジナルの Tra_TAG.def でも同様です。
オリジナルVZでも高橋版VZでも同様でした。

落ちるデータは、We140*22行あり、1行で3080文字を超えます。
3分割で改行を入れると落ちないので、一時バッファ溢れだと思いますが
今見ても全く分からないので、取りあえず泥縄で対策しました。

Tra_TAG.def の冒頭に

	dn[+, #] #? #< i=ly, #> i=(ly-i)*we+lx,	;1行の長さチェック
	(wn==0&&i>=255)?{ #< &x(254) #m #e}	;コンソール&行255以上なら改行
	#< dn],					;


これを入れたら取りあえず問題なくなりました。

:A	si=r-1, di=pq..134+100, i3,	;フルパス部分を di へ取り出し

この辺が怪しいと思うんですが、全く読めない。(;_;)
困ったときのFGALDC から、えむしさんの記事を引用します。m(__)m


> 07047/07051 xxxxxxxx  えむし           MAP
> (15)   97/07/23 09:02  07007へのコメント

>  とりあえず、私が持っている gz の MAP を書いておきます。

--------------------------------------------------------------------------

gz:0000h+---------------+
        |  psp          |
   0100 +---------------+  ORG
   0110 |               |  ◆pc
        |               |
        |               |
        |  wseg         |
   0206 |               |  変数テーブル
   028E |               |  ◆pq(pc+382)
        |               |
        +---------------+  pq+194(pn-156)
   03EC |               |  ◆pn(pq+350)
   0442 |               |  fg(pn+86)
   04D2 |               |  ◆mg(fg+144)
        |  dseg         |
   05B9 |               |  ◆pv(mg+231)
   062A |               |  ◆vp(pv+113)
        |               |                ↓
   0690 +---------------+ vp+102(pq..99)  -- ここまでvzと同じ
        |               |  コマンドキーテーブル
   08AA |               |  (pq..110)コマンドキーの説明書き
        |               |
   0F73 +---------------+ mh
        |  macro_buf    |
        |               |
    〜       〜
    〜       〜
        |               |
   AFD2 +---------------+  pq..131 pu-bc:削除バッファ
        | cbuff Bc byte |
   B3D2 +---------------+  pq..132 pu:スタックバッファ
        | ubuff Bu byte | マクロ用配列バッファ
        |   stack ↑    | スタックメモリの若い方へ積み上げる
   B452 +---------------+  pq..133 pu+bu:表示文字列バッファ
        | pfbufp 84byte | &m の時、ここでいったん文字列にしてから表示
   B4A6 +---------------+  pq..134 pu+bu+84:tmpbuf
        | tmpbuf 256byte| コマンドラインのラインバッファなどに使われる
   B5A6 +---------------+  pq..135 pu+bu+84+256:tmpbuf2
        |tmpbuf2 256byte| エイリアスの文字列はここで一度展開
   B6A6 +---------------+  pq..136 pu+bu+84+256*2:tmpbuf3
        |tmpbuf3 160byte| ディスク転送アドレス(DTA)
        |               |  &? は、ここで一度展開してから出力
        +---------------+
        |               |
   BA2C +---------------+  pq..142、pn..-33 pu+bu+1498
        |               |  コンバートされた検索文字列のバッファ
   BAAC +---------------+  pq..143
        |               |  コンバートされた置換文字列のバッファ
   BBB4 +---------------+  pq..141(pq..141)
        |               |  &^用のオプションの初期値
   CF2C +---------------+  pq..146
        | asm_stack?    |
   D02C +---------------+  pq..147
   DADC +---------------+ pn..-27(pq..148)wm+228
        | line_buf      |  (先頭はCR/LF実質wm+230が始め)
        |               |
   EADC +---------------+  pq..149
        |tmpbuf4 256byte|  256 バイトのテンポラリ領域(ラインバッファの直後)
        |               |  &z 等のマクロ組込時以外は比較的自由に使用できる
        +---------------+  pq..149+256   ラインバッファの終端
        |               |


引用ここまで --------------------

pq..134 を一時ワークとすると、最大でも256byte 
あとは、tmpbuf2 tmpbuf3 合わせても、672byte で、それをも突き破って
マクロ領域を壊してしまったと思われます。


      - No.8632 -    このTreeへ           [リストへもどる] pre

(8632) 8633Re: Tra_TAG.def のバグ  投稿者:としき   2018/12/02(日) 11:54
参照先:http://toshiki.la.coocan.jp/
    8632 番 konno さんへのコメント    コメント数 1

> タグジャンプしたら、マクロ領域を壊して、VTDOSが落ちました。

タグジャンプの際に、即時というか、すぐに落ちたということでしょうか。
時間差というか、しばらくしてから落ちるのに比べれば、切り分けは楽かと。
いや、もちろん、どんぐりの背比べ、という言葉もありますが。

約3000バイトを3分割したら落ちなくなったということは、約1000バイトならOK
ということですよね。なら、何バイトなら落ちるか、というあたりは追及する
必要はないのでしょうか。私は、そのバイト数からポイントが特定できるような
気がするのですが、それを追及する必要はないとか、追及しても意味がないと
いうことであれば、その理由をご教示いただければ幸いです。

      - No.8633 -    このTreeへ    コメント元:8632 へ [リストへもどる] soft

(8632) 8634Re^2: Tra_TAG.def のバグ  投稿者:konno   2018/12/02(日) 17:52
    8633 番 としき さんへのコメント    コメント数 1

> タグジャンプの際に、即時というか、すぐに落ちたということでしょうか。
> 時間差というか、しばらくしてから落ちるのに比べれば、切り分けは楽かと。

ああ、そうですね。それを書くのを忘れてました。
直ぐには落ちないです。
検索窓やオープン窓などのヒストリーがマクロコードになってしまいます。
その一行窓を閉じた時に落ちることもあれば、なかなか落ちないこともあります。
[ESC]+M でマクロ一覧を見ると、VZ.DEF と VZFL.DEF 以外は消えてしまって
いたりとか、色々な事象が発生します。

今頭がウニでマクロコードが読めないので、上記の事象でバッファ溢れと推測しました。
私はやっぱり泥縄式人なんですね。

暫定の対策も、コンソールのみとか、カーソルが一番下にあったときとか考えてないし
私の環境で動けばいいやという程度です。
検索ワードピッタリにジャンプできないのは仕方がないですかね。
まあ、長すぎる行は改行しとけという事で。

> 約3000バイトを3分割したら落ちなくなったということは、約1000バイトならOK
> ということですよね。なら、何バイトなら落ちるか、というあたりは追及する
> 必要はないのでしょうか。私は、そのバイト数からポイントが特定できるような
> 気がするのですが、それを追及する必要はないとか、追及しても意味がないと
> いうことであれば、その理由をご教示いただければ幸いです。

追及すれば出来ないことは無いかもですが、今は全然読めないので止めておきます。
どなたかキチンと対策が出来るようなら是非御教示願います。m(__)m


      - No.8634 -    このTreeへ    コメント元:8633 へ [リストへもどる] soft

(8632) 8635Re^3: Tra_TAG.def のバグ  投稿者:konno   2018/12/02(日) 23:44
    8634 番 konno さんへのコメント    コメント数 1

> 暫定の対策も、コンソールのみとか、カーソルが一番下にあったときとか考えてないし

案の定駄目でした。

	dn[+, #] #? #> #< &x(255)	;1行の長さチェック
	(cd==$d)? >a			;カーソル255桁目が改行なら >a
	(wn==0)?{ #< &x(254) #m #e}	;コンソールなら254桁目に改行挿入
:a	#< dn],				;


冒頭のルーチンを上のに変更したら、うまく動いているようです。


      - No.8635 -    このTreeへ    コメント元:8634 へ [リストへもどる] pre

(8632) 8636Tra_TAG.def 改 k04  投稿者:konno   2018/12/04(火) 23:17
    8635 番 konno さんへのコメント    コメント数 1

> 冒頭のルーチンを上のに変更したら、うまく動いているようです。

不要な部分を整理して、下記のようになりました。

	#] #? #> #< &x(255)		;バッファ溢れ対策 行の長さ255以上?
	(cd!=$d&&wn==0)?{&x(254)#m#e}#<	;コンソールなら改行挿入


Tra_TAG.def v16k04 として、#test72 に置いてきました。


ちなみに、Tra_TAG.def のルーチンは、vz16t.def にも使われていました。

> 12113/12115 xxxxxxxx  くらと           vz16t.defの雛形
> (15)   98/11/03 00:06                     コメント数:1
> 
> RE:MES 13 #04911 高橋 洋光 さん
> 
>   vz16t.def の雛形を作って見ました。


中身は同じものなので、バグも同様でしょう。


      - No.8636 -    このTreeへ    コメント元:8635 へ [リストへもどる] pre

(8632) 8637Tra_TAG.def 改 k05  投稿者:konno   2018/12/25(火) 03:13
    8636 番 konno さんへのコメント

> Tra_TAG.def v16k04 として、#test72 に置いてきました。

WEBデータによっては上手くいかない場合がありました。
改行コ−ドが、$0a のみの場合とかあるんですね。
それで、ct を思い出して、以下のように変更しました。

;	(cd!=$d&&wn==0)?{&x(254)#m#e}#<	;コンソールなら改行挿入
	(ct!=1&&wn==0)?{&x(254)#m#e}#<	; cd を ct に変更、各種改行に対応


TRA_TAG5.DEF として、VZマクロの部屋に置いてきました。
御使用時はリネームしてください。


      - No.8637 -    このTreeへ    コメント元:8636 へ [リストへもどる] pre