簡體   English   中英

vswprintf崩潰

[英]vswprintf crashes

使用10月2日發布的Symbian S60第五版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手冊頁之后),我是否還能弄清楚為什么這段代碼在對長字符串的vswprintf調用中崩潰了:-(完全相同的代碼在Linux機器上可以正常工作。為str分配了足夠的內存,再加上vswprintf仍然在檢查緩沖區溢出。不幸的是... S60調試器在此崩潰中沒有中斷,所以我沒有詳細信息:-(

有人有什么想法嗎?

假設Symbian的vswprintf例程中存在錯誤,那么使用POSIX兼容代​​碼可以替代哪些功能? (這應該是一個跨平台的庫)

謝謝。

對我來說,這似乎是進入vswprintf()調用的工作。 即使您只能進行程序集級調試,也應通過監視str[]內存中發生的事情來弄清到底發生了什么。

我偶然發現在vswprintf的實現中的內部緩沖區被硬編碼為128個字節。 這很可能導致長字符串崩潰。

將%S更改為%s-將大寫字母更改為小寫字母。

在基於MS的printfs中,%S表示Unicode字符,因此這就是123字符串失敗的原因,它期望每個字符2個字節。 (請注意,%S不是標准的一部分,因此Symbian在這里可能有所不同)

實際上,我認為這仍然適用於Symbian

您可以嘗試將%S格式說明符更改為%ls 正如我之前的評論中所提到的,它們應該是等效的,但是實現中可能存在錯誤。 請注意, vswprintf函數是在C99標准中定義的,並且由於還沒有完全符合標准的C99編譯器(我相信),因此任何給定的vswprintf實現都很可能不完全符合規范,或者它包含錯誤(前者比后者更有可能)。

如果該錯誤與VARARGS處理有關,您可以嘗試不調用test()而是使用swprintf嗎?

我現在通過使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM