C++ strncpy_函数的异常行为

C++ strncpy_函数的异常行为,c++,windows,visual-studio-2010,C++,Windows,Visual Studio 2010,使用Win32 API在VC++中开发程序;s适用于Windows 7 32位操作系统。 我使用string.h中提到的strncpy_函数进行安全复制,但在某些机器上它会崩溃 #if __STDC_WANT_SECURE_LIB__ _Check_return_wat_ _CRTIMP_ALTERNATIVE errno_t __cdecl strncpy_s(_Out_z_cap_(_SizeInBytes) char * _Dst, _In_ rsize_t _SizeInBytes, _

使用Win32 API在VC++中开发程序;s适用于Windows 7 32位操作系统。 我使用string.h中提到的strncpy_函数进行安全复制,但在某些机器上它会崩溃

#if __STDC_WANT_SECURE_LIB__
_Check_return_wat_ _CRTIMP_ALTERNATIVE errno_t __cdecl strncpy_s(_Out_z_cap_(_SizeInBytes) char * _Dst, _In_ rsize_t _SizeInBytes, _In_z_ const char * _Src, _In_ rsize_t _MaxCount);
#endif
这是stacktrace

>   msvcr100.dll!malloc(unsigned int size)  Line 89 + 0x3b bytes    C
    mfc100u.dll!operator new(unsigned int nSize)  Line 323 + 0x5 bytes  C++
    MyTest.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Copy(unsigned int _Newsize, unsigned int _Oldlen)  Line 1933 + 0x16 bytes C++
    MyTest.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(const char * _Ptr, unsigned int _Count)  Line 920 + 0x26 bytes  C++
    MyTest.exe!std::basic_stringbuf<char,std::char_traits<char>,std::allocator<char> >::str()  Line 97 + 0x2a bytes C++
    MyTest.exe!std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char> >::str()  Line 593 + 0x12 bytes    C++
    MyTest.exe!Trace<TraceToFile>::~Trace<TraceToFile>()  Line 174 + 0xa bytes  C++
    MyTest.exe!CCommonUtilities::sendDataToClient(std::basic_string<char,std::char_traits<char>,std::allocator<char> > strJson, int nCommandID, std::basic_string<char,std::char_traits<char>,std::allocator<char> > strFuncName, int nLineNumber, int nClientKey)  Line 320    C++
    MyTest.exe!CConnectionManager::AddConnectionThread(void * p_Param)  Line 270 + 0x74 bytes   C++
>msvcr100.dll!malloc(无符号整数大小)行89+0x3b字节C
mfc100u.dll!运算符new(未签名int nsig)行323 +0x5字节C++
MyTest.exe!STD::Basic字符串::复制(未签名int NexNeSIZE,未签名int yOdLLLN)行1933 +0x16字节C++
MyTest.exe!STD::Basic SqrS::赋值(conchchar *pTR,未签名int x计数)行920 +0x26字节C++
MyTest.exe!Std::Basic StRunBuff::St.(97)+0x2a字节C++
MyTest.exe!STD::Basic SooStReSoist::Stand(593)+0x12字节C++
MyTest.exe!跟踪::~跟踪()行174 +0xA字节C++
MyTest.exe!CUn公用实用工具:sDATDATOCLIONT(STD:StudioStaskStruthStJSON,INTRONDUDID,STD::Basic字符串STRAMNEXT,INTRONNENENUM,INTN CclitKEY)320行C++
MyTest.exe!CnCnsinMeals::AddConnectionThread(Valu*PpPARAM)行270 +0x74字节C++
基于此,是否有人能指出这是strncpy的问题还是编程错误?

如果我尝试调试代码,我永远不会遇到问题。当我们执行这个二进制文件时,它总是出现

非常感谢。

strncpy_的“安全性”与其说来自函数的实现,不如说来自调用方提供的有效输入,以及函数检查您是否超出了限制


换句话说,如果您谎称目标的大小(第二个参数),或者将无效地址作为源或目标传递给它,那么它将以某种方式出错

崩溃不在
strncpy\u s
中-它不会出现在堆栈跟踪上

崩溃在损坏的内存中;在
跟踪
析构函数中,您正在创建一个
std::basic_string
对象,该对象尝试分配内存并发现堆已损坏

查看
~Trace
CCommonUtilities::sendDataToClient()
中的代码,作为查找损坏的起点


为什么您认为它是
strncpy\u n()

提供的信息不足以诊断问题,但是如果
strncpy\u
中有错误,我会非常惊讶。假设代码中有bug,您应该可以安全地继续。如果运行调试生成掩盖了bug,尝试向一个发布版本添加日志记录语句。为什么在C++代码中使用<代码> STRNCPYIX < /代码>?在黑暗中猜测,在代码中没有初始化(经常解释调试/发布的差异),导致MALLC获得大量的数字并爆炸。没有看到你的代码,谁知道呢。我知道strncpy_s()中没有bug。你也极不可能找到一个。可以肯定地说,这是一个编程错误。