[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