[英]vswprintf() without buffer size crashes on small buffer instead of EOF. How to pass buffer size
[英]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.