HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0501
Drip●注意● HSP3.5におけるメモリリーク11解決


Drip

リンク

2018/5/1(Tue) 18:50:25|NO.84231

こんにちは。Dripです。

前回こちらの掲示板でも話題になったHSP3.5におけるメモリリークですが、
修正作業のほうは順調でしょうか…この問題ですが、
調べてみますとリークが発生するケースはかなり多いことに気付きました。
HSPは変数にデータを代入する際に変数の型変換を行っていることが
より状況を悪化させている気がします。
この問題を認識されていないHSP3.5の利用者の皆様はご注意ください。

前回こちらで報告されたメモリリークの例は次のようなものでしたが

//例1:split命令使用でのメモリリーク例 repeat repeat 60 sdim t,8 //ここでリーク? v="a,b,c,d,e,f,g,h,i,j,k" split v,",",t loop if cnt\20=0:if cnt/20\2:title "":else:title "■1秒あたり約2MBの速度でメモリリーク中!!■" await 10 loop

そのほかにも以下のような利用方法でメモリリークが容易に発生します。
タスクマネージャ等でメモリ消費が増えていく様子を確認してみてください。

//例2:最もシンプルなメモリリーク例 repeat repeat 1000 v="123","example" v=int(v) //ここでリーク? loop await 10 if cnt\20=0:if cnt/20\2:title "":else:title "■1秒あたり約2MBの速度でメモリリーク中!!■" loop

次に、モジュール利用時にもリークが発生するパターンを確認しています。
単にローカル変数を文字列変数として利用するだけでもメモリリークが発生します。

//例3:ローカル変数利用でのメモリリーク例 #module #deffunc func local t t="","" return #global repeat repeat 1100 func loop if cnt\20=0:if cnt/20\2:title "":else:title "■1秒あたり約2MBの速度でメモリリーク中!!■" await 10 loop

それに加えて、モジュール変数の利用でもメモリリークが発生します。

//例4:モジュール変数使用でのメモリリーク例 #module a v #modinit v(0)="d1" v(1)="d2" return #deffunc func newmod pv,a:return #deffunc work foreach pv delmod pv(cnt) //ここでリーク? loop return #global repeat repeat 1000:func:loop work await 10 if cnt\20=0:if cnt/20\2:title "":else:title "■1秒あたり約2MBの速度でメモリリーク中!!■" loop

HSPでは例2で挙げたような一時的に利用するような変数で無意識に型を変えながら
利用されるユーザーは結構多いような気がします。
型宣言は必ずやるという人でも、例3のように、ローカル変数までは変数の初期化を
行わずに使われてしまう方はいるのではないでしょうか。
一般的な作品のほかにも、弾幕シューティングやRPG、キャラクターがわらわらと
登場するようなタイプのゲームでは気付かないうちに深刻なメモリリークに陥って
しまっているケースが懸念されると思います。

この不具合だけでも修正していただき、HSPのメジャーバージョンアップ
(HSP3.51のような形で)をご検討いただけないでしょうか。
すぐにできない場合でも、HSPのトップページやダウンロードページ
(Vector及び窓の杜含め)などでこのような危険な不具合が存在していることの
注意喚起と修正プログラムの入手場所への誘導は必須に感じられます。
(サンプルスクリプトやモジュールなどで a="test","123" などと代入を行っている
 プログラムは数多く存在していますから、こうしたスクリプトをメインループ中に
 気軽に組み込む行為はHSP3.5においては非常に危険と思われます。)

HSP3.5は既に半年も運用しているバージョンですから、
なるべくならメジャーアップデート後も、HSP3.5で作成されたプログラムは
メモリリークのリスクをはらんでいることから利用者はアップデートを推奨する旨を
やんわりとでもいいですからニュースリリースに記載していただければ
被害は最小限に抑えられるかと思います。

どうぞ宜しくお願いいたします。



この記事に返信する


KA

リンク

2018/5/1(Tue) 20:36:30|NO.84232

面白そうなので 例1 で遊んでみる
----------------------------------------------------
;パターン1:発生
repeat
repeat 60
sdim t,8
v="a,b,c,d,e,f,g,h,i,j,k"
split v,",",t
loop
await 10
loop
----------------------------------------------------
;パターン2:発生
v="a,b,c,d,e,f,g,h,i,j,k"
repeat
repeat 60
sdim t,8
split v,",",t
loop
await 10
loop
----------------------------------------------------
;パターン3:未発生
v="a,b,c,d,e,f,g,h,i,j,k"
sdim t,8
repeat
repeat 60
split v,",",t
loop
await 10
loop
----------------------------------------------------
;パターン4:未発生
v="a,b,c,d,e,f,g,h,i,j,k"
repeat
repeat 60
sdim t,8
;split v,",",t
loop
await 10
loop
----------------------------------------------------
;パターン5:未発生
v="a,b,c,d,e,f,g,h,i,j,k"
repeat
repeat 60
;sdim t,8
split v,",",t
loop
await 10
loop
----------------------------------------------------

う〜ん、特定の組み合わせで発生するようですね。

不具合とは言えますが、書き間違い以外で実際に例のような
使い方をする事が有るのかどうか?
→気が付かなかったら重大ですね

ちなみにプロセスが終わっても解放されないのが「メモリリーク」
だったと思います。



科学太郎

リンク

2018/5/1(Tue) 20:53:46|NO.84233

> ちなみにプロセスが終わっても解放されないのが「メモリリーク」
> だったと思います。
違うような気がしますよ。

プロセスが実行中でもプログラマのミスにより、確保したメモリが解放されなければ、
一般的に「メモリ・リーク」と呼ぶと思いますね。



おにたま(管理人)

リンク

2018/5/1(Tue) 23:22:14|NO.84235

こんばんは、おにたまです。
HSP3.5における不具合と検証、ありがとうございます。
この問題について、修正したバージョンとしてHSP3.51を準備しています。
以下のOneDriveページから現在の修正版をご確認頂けます。

HSP3.5β版(OneDrive)
https://onedrive.live.com/embed?cid=EC425522ED849DA7&resid=EC425522ED849DA7%211229&authkey=AB-pNztAqBp6BcU

お手数おかけして申し訳ありませんが、リリースの調整まで今しばらくお待ち頂ければと思います。



Drip

リンク

2018/5/2(Wed) 11:22:25|NO.84237

おにたまさん

ご対応有難うございます。今回は原因が明らかでβ版提供はない感じでしょうか?
OneDriveですとどれをダウンロードすれば修正が確認できるかわからないですが、
検証できるようになりましたらこちらでも調べてみたいと思います。
(見たところファイルの更新日がパラパラと分かれているようですが…)
フルセットでなくともzipファイルでの差分アップデートで検証可能であれば
確認させていただきます。
修正は今回のメモリリークに関するもののみという認識で良いのでしょうか?
現在公開されている3.5から動作に変更がかかった更新履歴があれば助かります。

問題が解決することを祈っております。宜しくお願いいたします。



AviSoftware

リンク

2018/5/2(Wed) 15:55:55|NO.84238

例1と例2は処理待ちしてないからだね
応答なくなるはずだよ
なんで3.4は平気なのかな



ソラ

リンク

2018/5/2(Wed) 18:47:19|NO.84241

処理待ちってawaitとかwaitの事ですよね。
見たところawait 10が入っていますが・・・



AviSoftware

リンク

2018/5/3(Thu) 06:11:14|NO.84242

無限loopの中のloopには入ってない



AviSoftware

リンク

2018/5/3(Thu) 06:14:40|NO.84243

あ、全部なかった



Victware

リンク

2018/5/3(Thu) 13:23:54|NO.84244

例1の場合

repeat repeat 60 sdim t,8 //ここでリーク? v="a,b,c,d,e,f,g,h,i,j,k" split v,",",t    //------->ここにawait 10がない loop if cnt\20=0:if cnt/20\2:title "":else:title "■1秒あたり約2MBの速度でメモリリーク中!!■" await 10 loop



cheperuphy

リンク

2018/5/3(Thu) 21:02:55|NO.84254

Windowsは標準で5秒で応答なしになるはずですが、
splitを60回repeatしたくらいでは大丈夫でしょう

それと、メモリリークの件なのになぜ応答なしの話をしているのでしょうか?



ソラ

リンク

2018/5/4(Fri) 03:19:39|NO.84255

>>それと、メモリリークの件なのになぜ応答なしの話をしているのでしょうか?
同感。応答なしとメモリリークは関係ないかと。



ONION software Copyright 1997-2023(c) All rights reserved.