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手册页一百次之后)我能否弄清楚为什么在 vswprintf 调用长字符串时这段代码会在我身上崩溃:-( 完全相同的代码在 Linux 机器上运行良好. 为 str 分配了足够的内存,加上 vswprintf 无论如何都在检查缓冲区溢出。不幸的是 ... S60 调试器在这次崩溃时没有中断,所以我没有详细信息:-(

有人有什么想法吗?

假设 Symbian 的 vswprintf 例程中存在错误,那么使用 POSIX 兼容代码可能的替代函数是什么?(这应该是一个跨平台的库)

谢谢。

4

6 回答 6

1

我碰巧在 vswprintf 的实现中发现一个内部缓冲区被硬编码为 128 字节。这很可能会在长字符串上导致这样的崩溃。

于 2010-08-19T16:05:22.057 回答
1

对我来说,这看起来像是介入vswprintf()电话会议的工作。str[]即使您只能进行汇编级调试,也应该通过密切关注内存中的内容来清楚或多或少地发生了什么。

于 2008-10-17T21:59:52.247 回答
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

您可以尝试不调用 test() 而是使用 swprintf ——以防错误与 VARARGS 处理有关?

于 2008-10-18T00:04:21.763 回答
0

将 %S 更改为 %s - 将大写变为小写。

在基于 MS 的 printfs 中,%S 表示 unicode 字符,所以这就是 123 字符串失败的原因,它期望每个字符 2 个字节。(注意 %S 不是标准的一部分,所以 Symbian 在这里可能会有所不同)

实际上,我认为这仍然适用于Symbian

于 2008-10-17T21:48:12.537 回答
0

您可以尝试将%S格式说明符更改为%ls. 正如我之前的评论中提到的,它们应该是等效的,但是实现中可能存在错误。请注意,该vswprintf函数是在 C99 标准中定义的,并且由于还没有任何完全符合 C99 的编译器(我相信),任何给定的实现很可能vswprintf不完全符合规范,或者它包含错误(前者比后者更有可能)。

于 2008-10-17T22:06:52.840 回答