snprintfによるエラー

2590 ワード

昨夜テストでCOREファイルが山ほど出てきて、ログに印刷された問題を確認しました.場所:
       snprintf(loginfo.Msg,sizeof(loginfo.Msg),clog_message);この関数です.
この関数のプロトタイプを見てみましょう.
               int snprintf(char *str, size_t size, const char*format, ...);
この関数はclog_で文字をMessage定義のタイプはstrに書き込まれます.coreファイルのclogを見てみましょうメッセージの内容:
     
"[CdrDispatchBaseTask.cpp 445]operation_deal() ---mms_mt---
\t\t\t\t\t unique_key: 0-1028191948183074824
\t\t\t\t\t m_c_source_message_id: 1028191954317083996
\t\t\t\t\t m_n_delivery_status: 8
\t\t\t\t\t m_c_sender: 20000000002
\t\t\t\t\t m_c_receipter: 15823045451
\t\t\t\t\t m_c_delivery_time:20111028191948
\t\t\t\t\t m_c_expire_time: ", 'a' , "
\t\t\t\t\t m_c_subject: age-ID:<[email protected]>\r
MIME-Version:1.0\r
Content-Type: multipart/related; start=\"\";\r
\ttype=\"application/smil\";\r
\tboundary=\"----=_Part_2_1338990308.1319017264402\"\r
\r
------=_Part_2_1338990308.1319017264402\r
Content-Type:application/smil;name=start.smil\r
Content-Transfer-Encoding:binary\r
Content-ID: \r
Content-Location:start.smil\r
\r
\r
\r
\r
------=_Part_2_1338990308.1319017264402\r
Content-Type:text/plain;charset=utf-8\r
Content-Transfer-Encoding: binary\r
Content-ID:<1319017264400_0dba67bc29994d33bb84d49dd8989df8.txt>\r
Content-Location:1319017264400_0dba67bc29994d33bb84d49dd8989df8.txt\r
\r
", 'a', "\r
", 'a' ,"%s_%d.%s%s
\t\t\t\t\t m_c_priority: 97
\t\t\t\t\t m_n_message_size: 1633771873
\t\t\t\t\t m_c_delivery_report: 97
\t\t\t\t\t m_c_message_class: 97
"

ここには"%s_%d.%s%s」は、後で対応するパラメータをフォローする必要があります.適切なフィールドに書き込んでいないため、エラーが発生しました.
例:
                    printf("i am a chinese %s, notgerman %s","haha");
コンパイル中にエラーは発生しませんが、実行中にエラーが発生します.だから相応の修正が必要です.
 
変更方法:
             strncpy(loginfo.Msg, clog_message,sizeof(loginfo.Msg));
            loginfo.Msg[MAX_LOG_CONTENT_LEN - 1] ='\0';
strncpy()という関数は、コピーされた文字列がsizeof()より小さい場合、後ろに'0'を付けますが、超えるとカットオフはありませんので、一番後ろに1つ追加する必要があります.長すぎるとカットオフがあり、タイムアウトせず、一つあっても構わない.