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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
1020
nstrmidはメモリ違反しまくりです19解決


n

リンク

2007/10/20(Sat) 17:06:22|NO.11800

分かる人だけ見てくれればいいです。

slen=(int)strlen(sptr);if(p1<0){p1=slen-p2;if(p1<0)p1=0;}if(p2>slen)p2=slen;sptr+=p1;ptr=p=code_stmp(p2+1);for(i=0;i<p2;i++){chrtmp=*sptr++;*p++=chrtmp;if(chrtmp==0)break;}*p=0;
これはstrmidの実装コードです。

mes strmid( s, i, n )
そしてこれがスクリプトだとします。

strmidが遅い理由は、文字列長を調べる必要があるのはiが-1の時だけなのに、
hsp3.1では常に文字列長を数えています。
これが遅くなった一番の理由です。

しかし問題はそこではありません。
文字列の切り出し開始アドレスを求めるところで、文字列先頭へのポインタにパラメータをただ加算しているだけです。
文字列長は全く考慮されていません。
つまり、デフォルトで半角英数63文字分確保されている変数に対して

;例1 s = "abc" mes strmid(s, 1024, 3)
とすると確保しているメモリ領域外をアクセスしていることになります。アクセス違反です。
これでOSがエラーを出さないのは読み取っているだけだからでしょう。
しかし、言語規定では確保していない領域へポインタを向けたときの動作は未定義です。
つまり安全が保障されたものではないということです。

恐らく上の例1を実行した場合、空の文字列が表示されるハズです。(つまり何も表示されない)
しかし、これはたまたまこうなっただけの偶然の出来事です。
つまりstrmidを使った場合に予想もしない値(文字列)が返ってくることがあるのです。
それを再現させましょう。

;例2 s = "abcdefg" poke s, 3, 0 mes s mes strmid(s, 4, 10)
どうです?
3行目でsに入っている『文字列』は"abc"です。
その文字列を超えた位置から10文字切り出そうというコードです。
sに入っている文字列長が考慮されていないため、ポインタを向けた先が0ではないので『文字列』があるとして値を返しました。

例2は意図的にそういう状況を作り出したのですが、
では例1で文字列先頭から1024バイト目が0でなかったらどうなっていたでしょう。
0であるという保障はありません。
その証拠をご覧いれましょう。

;例3 s = "abc" mes strmid(s, 64, 3)
変な文字が表示されたのではないでしょうか?
次にこれはどうです?

;例4 s = "abc" m = "xyz" mes strmid(s,88,3)
変数にsを指定しているのにxyzと表示されてしまいました。

このような指摘を受けて今後どのように対応されるか楽しみです。

それから、HSPTVをご覧の皆様。
この話を聞いた感想をどしどし書き込んでください。お待ちしてます。



この記事に返信する


n

リンク

2007/10/20(Sat) 17:06:47|NO.11801

「strmidは遅くなった、遅くなった、memcpyを使えばいい、」
と文句を言うだけのやっ・・・方と、
原因をしっかり調べて問題点を指摘する俺。

俺が口だけ野郎だと思ってる方は前へ出てきてください・・・。



n

リンク

2007/10/20(Sat) 17:18:43|NO.11802

>strmidが遅い理由は、文字列長を調べる必要があるのはiが-1の時だけなのに、

最初にこう申しましたが、指摘した問題点を解決するには、毎回文字列長を調べてパラメータが文字列長を超えないようにするしかありません。
それをHSP内部で行うか、スクリプト上で行うかの違いです。

文句を言ってる方の中で
「俺たちは自分たちで文字列操作に責任を持つからHSP内部では文字列長のチェックはしないでくれ」
と言える人は、果たしているでしょうか?

言えないのでしたら
「俺たちには責任を背負いきれないからHSP内部でチェックして問題発生のリスクを無くしてください」
と、速度に関しては妥協するしかないと思います。



レヴィン

リンク

2007/10/20(Sat) 18:00:03|NO.11807

>>「strmidは遅くなった、遅くなった、memcpyを使えばいい、」
>>と文句を言うだけのやっ・・・方と、

まぁ、どうしてもいう場合は、β9を使えば関係ないですけどね。


>>「俺たちには責任を背負いきれないからHSP内部でチェックして
>>問題発生のリスクを無くしてください」
>>と、速度に関しては妥協するしかないと思います。

俺もそう思いますが。



n

リンク

2007/10/20(Sat) 18:00:49|NO.11808

>まぁ、どうしてもいう場合は、β9を使えば関係ないですけどね。

そんなことを言ってるんじゃないんだよ。



Halo

リンク

2007/10/20(Sat) 18:22:15|NO.11812

検証ご苦労様です。
確かにstrmidは宣言したメモリ空間の範囲を超えて参照をしているようです。
しかしそれはC++等でも可能なことです。

#include <stdio.h> void main(){ char *a={"HSP"}; printf("%c",a[21000]); //わけのわからないメモリ空間を参照して表示 }
strmidでもこれと同じ事が起こっているのだと思います。
メモリ空間外を参照することは良くない事ですが、他の言語でも頻繁に起こりうる
正常な動作なので、とやかく騒ぎ立てるほどの問題ではないと思います。
「確保されたメモリ空間の範囲を超えて、peek等で参照した時に、オーバーフロー
 エラーするのだから、strmidでもオーバーフローのチェックをした方が良いと思います。
 初心者向けの言語で、空間外参照を誘発する仕様は好ましくないと思います。」
程度の報告で充分ではないでしょうか。
また、明らかな不具合と確信が持てたのなら、その詳細をバグトラックへ報告すべきです。

逆にpoke等で

a="A":poke a,32000,65
として書き換えることが成功したり、一般保護エラーが発生する場合は
致命的な問題だと思います。

>このような指摘を受けて今後どのように対応されるか楽しみです。
>俺が口だけ野郎だと思ってる方は前へ出てきてください
nさんの文章は、どこかとても威圧的で、他の訪問者が見た時に大変不快な感情を抱かせます。
HSP掲示板 投稿時の注意 第3項
「不快になるような発言や威圧的な態度は取らないでください」
にも違反します。掲示板やバグトラック等に書き込まれる際には充分に注意してください。
ネチケットの尊重はインターネットを使用する者の最低限の義務です。
他者を批判する前に、まずは自分を改めてください。



レヴィン

リンク

2007/10/20(Sat) 18:24:58|NO.11813

>>そんなことを言ってるんじゃないんだよ。
わかってますよ。まぁまぁ、そう怒らずに。

そんなに文句があるなら、そういう人は、
そうなる前のバージョンでも使ってろってことであって、
別にnさんがどうだとか、そう意味で言ってるわけではないですよ。

nさんみたいに自分でできる人は問題ないかと思いますが、
できない人は、できない人はそうするしかないかなぁと、思っただけのこと。
俺はnさんが口だけ野郎だとは思ってないですし。
まぁ、もう少し言葉遣いは丁寧にしたほうがいいと思う部分はありますが(2レス目みたいに
丁寧に書けるんですから)。



n

リンク

2007/10/20(Sat) 18:28:29|NO.11814

>nさんの文章は、どこかとても威圧的で、他の訪問者が見た時に大変不快な感情を抱かせます。

またですか・・・。何回僕をいじめれば気が済むんですか?
そんなにnが嫌いですか?だったらmでもlでも改名しますよ・・・。

そうやって過剰に反応するから、おにたま様の監視が厳しくなるんですよ。
それに「お前の書き込みは不愉快だ」って遠慮なく書き込むのだって同じことなんじゃないですか?

そういうことは管理人に直接送ったほうがいいと思います・・・。
ここは他人を中傷する場所じゃないと思います・・・。



n

リンク

2007/10/20(Sat) 18:30:41|NO.11815

>「確保されたメモリ空間の範囲を超えて、peek等で参照した時に、オーバーフロー
> エラーするのだから、strmidでもオーバーフローのチェックをした方が良いと思います。
> 初心者向けの言語で、空間外参照を誘発する仕様は好ましくないと思います。」
>程度の報告で充分ではないでしょうか。

それです。それを具体例と合わせて周知を図りました。

>また、明らかな不具合と確信が持てたのなら、その詳細をバグトラックへ報告すべきです。

確信はまだ持てないですね。わざとそのようにしているとも考えられますし。
それに僕はみんなの嫌われ者だから、バグトラックへ報告しても、おにたま様に対処してもらえる自信がないです・・・。



レヴィン

リンク

2007/10/20(Sat) 19:06:48|NO.11817

>>そんなにnが嫌いですか?だったらmでもlでも改名しますよ・・・。
別に嫌いだから言われてるってわけではないと思いますが…
nさんが嫌いな人もいるでしょうが、そんなこと言ったら俺が嫌いな人もいるでしょう。
全員が全員、敵と判断するの間違いかと。

>>そういうことは管理人に直接送ったほうがいいと思います・・・。
それは最終手段だからやらないんですよ。

投稿する前に、"自分の書き込みが自分に対するレス"である思い、読んでみて下さい。
読んで自分で不快と思えば、それは他人も不快に思う可能性が高いということです。
読んで自分で不快と思わないというのであれば、それはそれでいいですが。



Akim

リンク

2007/10/20(Sat) 20:30:09|NO.11822

>俺が口だけ野郎だと思ってる方は前へ出てきてください???。

n君 そういう態度で 書き込むのは もう やめにしませんか?

君は自分の実力をアピールしているつもりなのでしょうが、
この掲示板は HSP歴10年近くの方々も多く見ているはずです。
その方々から見れば はっきり言って 君の書き込みは HSPを始めて
たかだか数ヵ月の初心者の戯言で それ以上の書き込みは見たことがありません。

自分のレベルの低さを自己アピールするのは 別段構いませんが、
先人の名を呼び捨てにする行為、他の方をバカにした態度、
意味の無い書き込み、他掲示板での HSPに対するネガティブな発言、
書かなくていいことを 連続投稿する行為、これらは 他人の家に
勝手に上がり込んで ゴミを ばらまく様なもので 招かれざる客です。

私の言っていることが 理解出来ないなら 君は根本から歪んでいると思いますので
また多くの DIONユーザーさんに迷惑をかける前に ここから 君だけ消えて下さい。


strmidの遅さについては 作者さんの意図しないバグで
今まで通り、次のバージョンで なおせばいいだけの話で
君が いちいち 鬼の首を取ったかのように解説してくれなくても
現象をみれば 何が起こっているかは ある程度のスキルがある方であれば、
ソースなんか見なくても容易に推測がつくことです。

君の書いたメモリ範囲外のスクリプト、誰が 好き好んで そのような
正常動作しないものを なおさずに放っておきますか?
スクリでバグが出たらなおすべきでしょう?

HSP内部では スクリを間違ったときの事まで考慮しろとでも言うのですか?

特に メモリ操作命令は HSP2の仕様同様 内部では余計なことはせず
うまく使えば 高速化を可能とする命令は残しておいてもらいたい。
strmidも同様。必要があるときにだけユーザーが必要な処理をすればいいこと。



tks

リンク

2007/10/20(Sat) 20:47:36|NO.11824

「strmidは遅くなった、遅くなった、memcpyを使えばいい、」
と文句を言うだけの奴なtksです。

> 最初にこう申しましたが、指摘した問題点を解決するには、毎回文字列長を調べて
> パラメータが文字列長を超えないようにするしかありません。

もちろんそうしていましたし、そうしています。バグトラックにあるような
p="ABCDEFG"
mes strmid (p,2,100000000)
という使い方をする方がいるとは思ってもみませんでした。

> 原因をしっかり調べて問題点を指摘する俺。

n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>tks
ってことでOKです。



n

リンク

2007/10/20(Sat) 21:04:46|NO.11825

ゆがんでいるのはAkimさんじゃないですか?
僕は以前のように口悪く言う態度は改めましたが、
Akimさんの人を○○君と呼んだりするのはまさに以前の僕そのものです。

>strmidの遅さについては 作者さんの意図しないバグで

言わせていただきますが、作者が書かずに誰が書くんですか?


>現象をみれば 何が起こっているかは ある程度のスキルがある方であれば、
>ソースなんか見なくても容易に推測がつくことです。

現象を見ようともしなかったAkimさんが何を言ってるんですか・・・。
「ソースなんか見なくても」と高をくくったような発言はある程度のスキルのある方はいいません。
ある程度のスキルのある方はソースをちゃんと見て原因を究明するものだと思います。
ある程度のスキルのある方とない方の差は、推測のままで終えるか、究明するかの違いだと思いますよ。

# Σ('ロ'! 自分のことを言ってるんじゃなくて・・・

なんだか僕に文句を言いたい方は何か僕に恨みでも持ってるんでしょうか?
僕はこのスレッドでHaloさんにまとめて頂いたように「strmid」のことを言いたかっただけなのに、
なんでこう僕の方に話を逸らすんですか?
もうやめてください。



n

リンク

2007/10/20(Sat) 21:16:21|NO.11827

>という使い方をする方がいるとは思ってもみませんでした。

パラメータにどのような値を指定されるか、想定不足ですね、開発ティームの。



n

リンク

2007/10/20(Sat) 21:42:57|NO.11829

>Halo氏
>他の言語でも頻繁に起こりうる
>正常な動作なので、

意図して領域外を参照するようなコードは正常だと思いますが、
意図して領域外を参照するコードに意味を見出せず、
「起こりうる」という可能性にかけた動作は「正常」とは呼べないのではないでしょうか?



n

リンク

2007/10/20(Sat) 23:05:32|NO.11833

>もちろんそうしていましたし、そうしています。バグトラックにあるような
>p="ABCDEFG"
>mes strmid (p,2,100000000)
>という使い方をする方がいるとは思ってもみませんでした。

あちらはメモリの消費量でこのスレッドとは話が違います。

あちらのメモリの消費量の問題は旧strmidの実装を見れば分かると思いますが
第三パラメータの文字数分のメモリをまんま確保していたのが原因です。
確保する最大メモリは第一パラメータに指定した文字列のサイズ+1バイトです。
hsp3.1のstrmidの実装ではそうなっていることが見て取れますね。



ムルアカ

リンク

2007/10/20(Sat) 23:16:26|NO.11834

>ここから 君だけ消えて下さい。
典型的いじめの実態。



とんび

リンク

2007/10/20(Sat) 23:38:05|NO.11835

>n
海ってあるよね。ザザーンと波が打ち寄せる海。
あそこにね。ナマコって生物がいるんだよ。
彼らならリーダーの登場を待っているかも知れないから
そっちに行ってあげたらどうかな?
「われわれはnさんの登場を待っていたのだナマ〜」
「そうだナマ〜」って付いて来てくれるかも知れないよ。
語尾にナマ〜って付けながら。ナマコだから。



ムルアカ

リンク

2007/10/21(Sun) 00:01:37|NO.11836

HSPユーザーってのはやっぱいじめっ子世代が多いから"サイバネティックいじめ"も流行ってんのかな。
それかww302jpさんを扱うように過去の不祥事をいつまでも引きずって"他人を認めたがらない"世代も多いんだろうな。



tks

リンク

2007/10/21(Sun) 00:18:19|NO.11837

> あちらはメモリの消費量でこのスレッドとは話が違います。

あの件を出したのは、私はああいう使い方はせずにstrmidを使う時には文字列長を
確認していたので、速度の妥協はしたくありませんってことで。そもそもmemcpyを
使っていればよかったことなので、strmidが遅くなったことに関して文句を言った
覚えはありません。

旧strmidの仕様ではメモリ消費の問題があったので変更になったわけですが、
現strmidにも領域外にアクセスできてしまう問題があると。では、領域外に
アクセスしようとしたらエラーにするのか、それ以外の修正方法がいいのか、
その要望を聞くのがこのスレッドの趣旨ということになるでしょうか?



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