2014-10-02 50 views
5

我的程序在多个平台上运行。其中,Windows CE。目前,sprintf被广泛使用,这导致了缓冲区溢出等很多问题。我想用snprintf来代替这些调用。对于Visual Studio,我发现这个问题,解决这个问题的win32部分:用于Windows CE的snprintf

snprintf and Visual Studio 2010

,但我无法得到它的Windows CE的工作,因为功能_vsnprintf_s_vscprintf,并不断_TUNCATE不可用。有谁知道在Windows CE上复制snprintf(linux)行为的方法吗?

+0

检查此响应是否可以为您提供有用信息http://stackoverflow.com/questions/23882340/windows-ce-5-0-vs-windows-mobile-6/23883768#23883768 – daniele3004 2014-10-02 09:33:15

回答

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'不能解决bug代码?你需要重新写两种方式,你必须测试'snprintf'的返回值来查看是否有足够的空间可用,如果没有,请重新分配缓冲区(或任何适合您的情况)。 – mafso 2014-10-02 12:51:26

+0

是的,我知道 - 这将是调试代码的下一步..现在的主要目的是为了避免一些神秘的崩溃造成的溢出 – pjaall 2014-10-02 13:03:16

+0

'现在的主要目的是为了避免一些神秘的崩溃造成的溢出'我不认为你会修复你的错误,它只会隐藏真正的根源问题。 snprintf将防止缓冲区溢出,但是如果您的代码逻辑需要更大的数据并且缓冲区太小,那么它仍然不能正常工作。 – marcinj 2014-10-03 08:33:04

0

我想,你可以使用微软专用的printf_s函数。我不确定它是否100%兼容,并且我认为它不允许缓冲区在size为0时为空,但它可能足够满足您的要求并且...我没有VS2010来确认printf_s存在于Windows CE版本。