繁体   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