-2

Windows 7 32 ビット OS 用の Win32 API を使用して、VC++ でプログラムを開発します。安全なコピーのためにstring.hに記載されているstrncpy_s関数を使用しましたが、一部のマシンでクラッシュします。

#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

ここにスタックトレースがあります

>   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++

これに基づいて、これがstrncpy_sまたはプログラミングエラーの問題であるかどうかを誰かが指摘できますか?

コードをデバッグしようとしても、問題は発生しません。このバイナリを実行すると、常に発生します。

よろしくお願いします。

4

2 に答える 2

0

の「安全性」はstrncpy_s、関数の実装からではなく、有効な入力を提供する呼び出し元と、制限を超えていないことをチェックする関数から得られます。

つまり、strncpy_s送信先のサイズ (2 番目のパラメーター) について嘘をついたり、送信元または送信先として無効なアドレスを渡したりすると、何らかの形で問題が発生します。

于 2013-07-24T13:21:30.017 に答える