0

10 月 2 日にリリースされた Symbian S60 第 5 版 SDK を使用して、次のコード スニペットをコンパイル/実行しています (sim 上で):

void test(wchar_t *dest, int size, const wchar_t *fmt, ...) {
    va_list vl;
    va_start(vl, fmt);
    vswprintf(dest, size, fmt, vl);
    va_end(vl);
}

...

wchar_t str[1024];

// this crashes (2nd string 123 characters (+ \0) equals 248 bytes)
test(str, 1024, L"msg: %S", L"this is a test messagethis is a test messagethis is a test messagethis is a test messagethis is a test messagethis is a tes");

// this works (2nd string 122 characters (+ \0) equals 246 bytes)
test(str, 1024, L"msg: %S", L"this is a test messagethis is a test messagethis is a test messagethis is a test messagethis is a test messagethis is a te");

明らかな理由はありませんが ( vswprintfのマニュアル ページを 100 回読んだ後でも)、長い文字列の vswprintf 呼び出しでこのコードがクラッシュする理由を理解できます :-(まったく同じコードが Linux ボックスで正常に動作します. str には十分なメモリが割り当てられており、さらに vswprintf はとにかくバッファ オーバーランをチェックしています. 残念ながら ... S60 デバッガはこのクラッシュで壊れないので、詳細はわかりません :-(

誰にもアイデアはありますか?

Symbian の vswprintf ルーチンにバグがあると仮定すると、POSIX 準拠のコードを使用した代替関数として何が考えられるでしょうか? (これはクロスプラットフォームのライブラリであるはずです)

ありがとう。

4

6 に答える 6

1

私には、これは電話に出るための仕事のように見えvswprintf()ます。アセンブリレベルのデバッグしか実行できない場合でも、メモリに何が入っているかを監視することで、多かれ少なかれ何が起こっているのかを明確にする必要がありstr[]ます。

于 2008-10-17T21:59:52.247 に答える
1

vswprintf の実装内の内部バッファが 128 バイトにハードコードされているのをたまたま見つけました。これにより、長い文字列でこのようなクラッシュが発生する可能性が非常に高くなります。

于 2010-08-19T16:05:22.057 に答える
0

%Sフォーマット指定子をに変更してみてください%ls。以前のコメントで述べたように、それらは同等であるはずですが、実装にバグがある可能性があります。vswprintf関数はC99標準で定義されており、完全に準拠したC99コンパイラがまだないため(私は信じています)、の特定の実装がvswprintf仕様に完全に準拠していないか、バグが含まれている可能性が非常に高いことに注意してください(前者は後者よりも可能性が高い)。

于 2008-10-17T22:06:52.840 に答える
0

Symbian 関数を使用してこのタスクを実行することで、この問題を「解決」しました。

void test(wchar_t *dest, int size, const wchar_t *fmt, ...) {
    VA_LIST args;
    VA_START(args, fmt);

    TPtrC16 fmtPtr((const TUint16*)fmt, wcslen(fmt) + 1);  
    TPtr16  targetPtr((TUint16*)dest, size);

    targetPtr.FormatList(fmtPtr, args);
    targetPtr.ZeroTerminate();

    VA_END(args);
}

(この場合、実際には%s を使用する必要があります)

于 2008-10-19T06:56:42.817 に答える
0

%S を %s (大文字から小文字) に変更します。

MS ベースの printfs では、%S は Unicode 文字を意味するため、123 文字の文字列が失敗する理由は 1 文字あたり 2 バイトと予想されるためです。(注 %S は標準の一部ではないため、Symbian はここで異なる場合があります)

実際、それはSymbianにも当てはまると思います。

于 2008-10-17T21:48:12.537 に答える
0

バグが VARARGS 処理に関係している場合に備えて、test() を呼び出さずに、代わりに swprintf を使用してみてください。

于 2008-10-18T00:04:21.763 に答える