int geturlparserfunc(const char* name, char* rhost, char* rpath)
{
int bmfunc_rlen = 0;
int inputlen = strlen(name)+1;
char32_t inp32b[50];
int arraycount1 = 0, arraycount2 = 0;
mbstate_t mbstate = 0;
char temphost[MB_LEN_MAX+1];
char temppath[MB_LEN_MAX+1];
int while_n = 0;
int slashconunt = 0, colon = 0;
int rpathpp = 0, rhostpp = 0;
rhost = '\0', rpath = '\0';
while (1){
bmfunc_rlen = mbrtoc32(&inp32b[arraycount1], &name[arraycount2], MB_LEN_MAX, &mbstate);
if ( -1== bmfunc_rlen ){
printf("エラーが発生しました\n");
printf("エンコードエラー又はバイト数が足りませんの可能性があります。");
printf("エラー size_t サイズ : %zu\n", bmfunc_rlen);
break;
} else if ( -2 == bmfunc_rlen ){
printf("エラーが発生しました\n");
printf("マルチバイト文字の可能性があります。");
printf("エラー size_t サイズ : %zu\n", bmfunc_rlen);
break;
} else if ( -3 == bmfunc_rlen ){
arraycount1 += 1;
continue;
} else if (0 == bmfunc_rlen ){
break;
} else if ( 0 < bmfunc_rlen ){
arraycount1 += 1;
arraycount2 += bmfunc_rlen;
}
}
while (arraycount1 > while_n){
while_n += 1;
if (':' == inp32b[while_n] || '/' == inp32b[while_n]){
if ( ':' == inp32b[while_n]){
colon = 1;
}
if ('/' == inp32b[while_n]){
slashconunt+=1;
}
}
// rpath
if ( 3 < slashconunt && 1 == colon) {
bmfunc_rlen = c32rtomb(temppath ,inp32b[while_n], &mbstate);
if (-1 == bmfunc_rlen){
printf("エラーが発生しました\n");
printf("有効なワイド文字ではありません\n");
printf("エラー size_t サイズ : %zu\n", bmfunc_rlen);
break;
}
rpath = malloc(bmfunc_rlen);
sprintf(rpath, "%s", temppath);
}
// rhost
if ( 2 == slashconunt && 1 == colon){
bmfunc_rlen = c32rtomb(temphost ,inp32b[while_n], &mbstate);
if ((size_t)(-1) == bmfunc_rlen){
printf("エラーが発生しました\n");
printf("有効なワイド文字ではありません\n");
printf("エラー size_t サイズ : %zu\n", bmfunc_rlen);
break;
}
rhost = malloc(bmfunc_rlen);
sprintf(rhost, "%s", temphost);
}
}
printf("%s\n", rpath);
arraycount1 = 0, arraycount2 = 0, slashconunt = 0, colon = 0 , bmfunc_rlen = 0;
}
マルチバイトの変換後出力がNULL
マルチバイトの変換後出力がNULL
面倒なことはCGo使おう!
Re: マルチバイトの変換後出力がNULL
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: マルチバイトの変換後出力がNULL
最初から引数にNULLを与え、それを書き換えなければ、NULLのままになるでしょう。
例えば、第一引数を とした場合、rpathへの代入は行われません。
どうして geturlparserfunc の呼び出し元を開示してくれなくなったのでしょうか?
指摘から逃げてもコードが勝手に改善することはないでしょう。
さらに、この部分
・確保している要素数が少なくともナル文字の分足りず、範囲外への書き込みが発生する
・ナル終端されていない配列を%s用に渡している
ため、未定義動作になります。
例えば、第一引数を とした場合、rpathへの代入は行われません。
どうして geturlparserfunc の呼び出し元を開示してくれなくなったのでしょうか?
指摘から逃げてもコードが勝手に改善することはないでしょう。
さらに、この部分
については、
・確保している要素数が少なくともナル文字の分足りず、範囲外への書き込みが発生する
・ナル終端されていない配列を%s用に渡している
ため、未定義動作になります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: マルチバイトの変換後出力がNULL
sprintf(rhost, "%s", temphost);
の部分が配列ではないかったのかっと思うci
問題の部分を取り出し写したコード
の部分が配列ではないかったのかっと思うci
問題の部分を取り出し写したコード
面倒なことはCGo使おう!
Re: マルチバイトの変換後出力がNULL
申し訳ありません。意味がよくわかりません。
- printf("%s\n", ae);は、文字列(ナル終端された文字の配列)へのポインタを要求する%sに対してナル終端されていない領域へのポインタを渡しているため、未定義動作になります。
よくある挙動としては、tempaeの最初の要素である「a」に続いて、ゴミが出力されることがあります。 - printf("%s\n", a);は、文字列へのポインタ(char*)を要求する%sに対してchar型のデータ(可変長引数の部分なのでintに変換される)を渡しているため、未定義動作になります。
よくある挙動としては、渡された整数を無理やりポインタとして解釈したものは無効な場所を指しているので、値を読み取ることができず、アクセス違反(Segmentation Fault)になることがあります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: マルチバイトの変換後出力がNULL
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: マルチバイトの変換後出力がNULL
有効なデータの範囲内に終端のナル文字('\0')が無いため、
続けて無効な(範囲外で何があるかわからない)領域を読み、ナル文字の前まで出力してしまうからです。
printfは少なくともC89にはあります。
The C89 Draft
これはポインタaeが指している場所にポインタtempaeが指しているものを代入するコードですね。
aeは関数名としても使われており紛らわしいですが、ここでは引数(char*型)として解釈され、
この引数には有効なポインタが渡されています。
また、tempaeは配列ですが、ここでは配列の先頭要素へのポインタに変換され、
この先頭要素には不定でない値が入っています。
したがって、この行は問題ないと考えられます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: マルチバイトの変換後出力がNULL
継続して扱うと言えるのかどうか分かりませんが、続けて使うことはできます。
Re: マルチバイトの変換後出力がNULL
前回出力したバイト数がsに格納されているので、
bufが指す位置をその分進めて、前回書き込んだ内容の次から書き込むようにしていますね。
bufが指す位置をその分進めて、前回書き込んだ内容の次から書き込むようにしていますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)