代码之家  ›  专栏  ›  技术社区  ›  Serve Laurijssen

通过(尺寸\u t)-1至snprintf \u s

  •  0
  • Serve Laurijssen  · 技术社区  · 7 年前

    关于C++ StayWalk的一个问题: https://github.com/JochenKalmbach/StackWalker

    #define _TRUNCATE ((size_t)-1)
    
    enum
    {
        STACKWALK_MAX_NAMELEN = 1024
    }; 
    
    void StackWalker::OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName)
    {
        CHAR   buffer[STACKWALK_MAX_NAMELEN];
        size_t maxLen = STACKWALK_MAX_NAMELEN;
    #if _MSC_VER >= 1400
        maxLen = _TRUNCATE;
    #endif
        _snprintf_s(buffer, maxLen, "SymInit: Symbol-SearchPath: '%s', symOptions: %d, UserName: '%s'\n",
            szSearchPath, symOptions, szUserName);
    }
    

    maxlen首先被设置为1024,然后如果VC++version>=1400(它是),那么它被设置为(unsigned)-1,换句话说至少UINT\u MAX。

    我是不是漏了什么?为什么要把马克斯伦调到尤恩特马克斯?使用安全字符串函数但没有安全性?

    1 回复  |  直到 7 年前
        1
  •  1
  •   rici    7 年前

    你的超负荷 _snprintf_s

    见下文第二段 Remarks documentation _TRUNCATE

    但是请注意,对于VS的早期版本,代码使用 _snprintf ,它对宏一无所知 :

    #if _MSC_VER < 1400
    // ...
    #define _snprintf_s _snprintf
    

    _snprintf公司 ,他必须安排缓冲区长度通过。 snprintf 没有可以推断字符缓冲区参数长度的模板化重载。而且,他需要 #define _TRUNCATE stdlib.h

    总而言之,对于一个不必要的复杂的非标准库函数来说,这是一个非常笨拙的解决方法。