Windows CE下的snprintf

5
我的程序可以在多个平台上运行,其中包括Windows CE。目前,广泛使用sprintf,导致出现了许多缓冲区溢出等问题。我想用snprintf的调用来替换它们。对于Visual Studio,我找到了这个问题,解决了win32部分的问题: snprintf and Visual Studio 2010 但是我无法在Windows CE上使其工作,因为函数_vsnprintf_s和_vscprintf以及常量_TRUNCATE不可用。有人知道如何在Windows CE上复制snprintf(linux)的行为吗?

检查此响应是否能够提供有用的信息 http://stackoverflow.com/questions/23882340/windows-ce-5-0-vs-windows-mobile-6/23883768#23883768 - daniele3004
3个回答

1
到目前为止,我已经得到了以下的函数:

int my_snprintf(char* str, size_t size, const char* format, ...)
{
    int len = 0;
    va_list ap;

    if (size == 0)
    {
        return 0;
    }

    va_start(ap, format);
    len = _vsnprintf(str, size, format, ap);
    va_end(ap);

    if (len < 0 || len >= size)
    {
        len = size - 1;
    }

    if (size > 0)
    {
        str[size - 1] = '\0';
    }

    return len;
}

初步测试看起来还好,甚至可以编译为WinCE。非常感谢您的反馈。


1
到目前为止看起来不错。只是要提一下:你知道snprintf不能修复有缺陷的代码吗?你必须重写代码,无论如何,你必须测试snprintf的返回值,以查看是否有足够的空间可用,如果没有,则重新分配缓冲区(或在您的情况下适当的其他操作)。 - mafso
是的,我知道——那将是调试代码的下一步。现在的主要目的是避免由溢出引起的一些神秘崩溃。 - pjaall
现在的主要目的是避免由于溢出而导致的一些神秘崩溃。我认为这样做并不能解决你的错误,只会隐藏真正的根本问题。snprintf可以防止缓冲区溢出,但如果你的代码逻辑需要更大的数据而缓冲区太小,则仍然无法正常工作。 - marcinj
是的,没错。这种类型的错误比由缓冲区覆盖引起的错误要容易跟踪得多 - 后者可能会在更多或更少的随机位置出现。 - pjaall
注意:if (size > 0) 的第二个测试是不必要的。 - chux - Reinstate Monica

0
我认为,你可以使用 Microsoft 特定的 printf_s 函数。我不确定它是否百分之百兼容,并且我认为当大小为 0 时,它不允许缓冲区为空,但这可能已经足够满足你的要求了... 我没有 VS2010 来确认 printf_s 是否存在于 Windows CE 版本中。

0

是的,那就是这些兼容性问题的起点 - 我应该在问题中提到的.. :) - pjaall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接