スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

HSP3dishのバグ

HSP3dishのバグを報告しようと思ったのですが、どこに報告していいのかわからず…。
(バグトラッカーは当方の回線からはなぜか入れず…)
とりあえずは、ここに書いておきます(^_^;)

コメントアウトした部分が従来のソースです。

■supio_ios.cpp/supio_ndk.cpp:
void getpath( char *stmp, char *outbuf, int p2 )


switch( p2&7 ) {
case 1: // Name only ( without ext )
// stmp[ strlen(tmp)-strlen(p_ext) ] = 0;
tmp[ strlen(tmp)-strlen(p_ext) ] = 0;
strcpy( p, tmp );
break;



これはよくあるバグです(打ち間違え)

■hspvar_str.cpp
static void HspVarStr_EqI( PDAT *pdat, const void *val )
static void HspVarStr_NeI( PDAT *pdat, const void *val )


// Eq
static void HspVarStr_EqI( PDAT *pdat, const void *val )
{
if ( strcmp( (char *)pdat, (char *)val ) ) {
*(int *)pdat = 0;
} else {
// *(int *)pdat = 1;
*(int *)pdat = !0;
}
myproc->aftertype = HSPVAR_FLAG_INT;
}

// Ne
static void HspVarStr_NeI( PDAT *pdat, const void *val )
{
// int i;
// i = strcmp( (char *)pdat, (char *)val );
// *(int *)pdat = i;

if (strcmp( (char *)pdat, (char *)val ))
{
*(int *)pdat = !0;
} else {
*(int *)pdat = 0;
}
myproc->aftertype = HSPVAR_FLAG_INT;
}



これはちょっとむずかしい。
strcmpは0かret > 0 か ret < 0を返すことが予期されます。

これは内部的には文字コードを引き算により比較していると考えられます(実装により異なる)
文字A - 文字Bですから、1以上の数、-1以下の数も戻るはずです。

hsp3dishではif文のそれぞれの結果はビット演算のANDで比較するため、
本来、a="a"として、a == "a" & a != "c"の結果は真ですが、正しくなりません。

■テストコード


#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
char *a="a";
char *b="c";

int ret1 = 0;
int ret2 = 0;

ret1 = 1;
ret2 = strcmp(a,b);

printf("ret1 = %d,ret2 = %d\n", ret1, ret2);
printf("ret1 & ret2 = %d\n", ret1 & ret2);

return 0;
}



■実行結果

ret1 = 1,ret2 = -2
ret1 & ret2 = 0


スポンサーサイト

コメント

非公開コメント

プロフィール

BouKiCHi

Author:BouKiCHi
ABOUT ME
MAIL:alf_byncyou at hotmail.com

WEB:http://clogging.web.fc2.com/
TWITTER:@bkc_alf

月別アーカイブ

FC2カウンター

ブロとも申請フォーム

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。