全然更新しないブログ
HSPメモ帳
mod_ScreenResize
- mod_ScreenResize
-
現在アクティブなウィンドウをサイズ変更可能にします。 リサイズ後のクライアントサイズは変わりません。
#include "mod_ScreenResize.hsp" screen 0, 300, 300 ScreenResize stop
コメント ( 0 ) | Trackback ( 0 )
cnvstow
cnvstow
下記のcnvstowエラーは、2012/06/14 3.31β1 で、修正されています。
cnvstowの第一引数に指定する変数は、(変換元の文字列サイズ + 1) * 2 以上確保する必要があります。
そうでない場合、予期しないエラーが発生する可能性があります。
コード1を実行、終了後にエラー報告ダイアログが出ました。
この件は、HSP3のバグトラックに報告しています。
コード1 - 終了時にエラーが発生する可能性があります
sdim dst, 64 sdim src, 1024 repeat 1000 : src += "x" : loop cnvstow dst, src stop
UNICODE変換は、hsp3ext_win.cppのcnvwstr関数を使用しているようですが、
cnvstowではwchar_t単位ではなくchar単位でbufsizeを指定しているためバッファオーバーフローしているようです。
int cnvwstr( void *out, char *in, int bufsize ) { // sjis->unicode に変換 // return MultiByteToWideChar( CP_ACP, 0, in, -1, (LPWSTR)out, bufsize ); }
dupptr
static void HspVarStr_Set( PVal *pval, PDAT *pdat, const void *in ) { char **pp; if ( pval->mode == HSPVAR_MODE_CLONE ) { strncpy( (char *)pdat, (char *)in, pval->size ); return; } pp = (char **)sbGetOption( (char *)pdat ); sbStrCopy( pp, (char *)in ); //strcpy( GetPtr(pval), (char *)in ); }
とあります。MSDNによればstrncpyは、
char *strncpy(char *strDest, const char *strSource, size_t count);
strncpy 関数は、strSource の最初の count の文字数を strDest にコピーし、strDest を返します。count で指定した文字数が strSource の文字数より少ない場合、NULL 文字はコピー先の文字列に追加されません。count で指定した文字数が strSource の文字数よりも多い場合は、count の文字数になるまで、コピー先文字列に NULL 文字が埋め込まれます。コピー元の文字列とコピー先の文字列が重なり合う場合、strncpy 関数の動作は未定義です。
strncpy 関数は、strSource の最初の count の文字数を strDest にコピーし、strDest を返します。count で指定した文字数が strSource の文字数より少ない場合、NULL 文字はコピー先の文字列に追加されません。count で指定した文字数が strSource の文字数よりも多い場合は、count の文字数になるまで、コピー先文字列に NULL 文字が埋め込まれます。コピー元の文字列とコピー先の文字列が重なり合う場合、strncpy 関数の動作は未定義です。
とあります。大きなサイズや頻繁に代入が必要なクローン文字列変数を使う場合、代入は使わないでmemcpyなどを使用したほうがいいかと思います。
逆に、常にクリアしたい時は便利かもしれません(固定バッファサイズの文字列を送信する時など)。
コメント ( 0 ) | Trackback ( 0 )