[解決済み] ヒープ破損の検出:通常ブロックの後
2022-02-12 05:33:39
質問
アプリケーションがヒープバッファのメモリ終端に書き込んだことをCRTが検出しました。に到達するとクラッシュしてしまいます。
free
. 何かお手伝いできることがあればお願いします。
int messageFunction(char* message) {
char* sPtr = strstr(message,"Subject:");
char* cPtr = strstr(message,"Content:");
char* messageSubject = (char*) malloc(cPtr - sPtr - strlen("Subject:"))
char* messageContent = (char*) malloc(strlen(cPtr + strlen("Content:")))
strncpy(messageSubject,
stPtr + strlen("Subject:"),
cPtr - sPtr - strlen("Subject:"));
messageSubject[cPtr - sPtr - strlen("Subject:")] = '\0';
strncpy(messageContent,
cPtr + strlen("Content:"),
strlen(cPtr + strlen("Content:")));
...
free(messageSubject);
free(messageContent);
}
void main() {
char* message = "Subject:HelloWorldContent:MessageContent";
int result = messageFunction(message);
}
解決方法は?
1バイト足りないメモリを割り当てている。あなたの計算は、例えば "Subject:" と "Content:" の間のデータの長さですが、文字列内のヌル終端の必要性は考慮されていません。そのため、手動でヌルターミネーターを追加すると、配列の末尾を越えて書き込むことになり、未定義の動作を引き起こすことになります。
以下のようなコードに変更すると直るはずです。
char* messageSubject = malloc(cPtr - sPtr - strlen("Subject:") + 1)
char* messageContent = malloc(strlen(cPtr + strlen("Content:")) + 1)
また、"..." セクションのコードが表示されていないので、終端されていない文字列があるかもしれませんが、それが文字列ライブラリルーチンによって処理されている場合、問題が発生する可能性があります。
関連
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】strcmpが機能しない
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み] '{'トークンの前に期待される式
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】 error: too few arguments to function `printDay' (C言語)
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み] Cプログラムで「配列の添え字が整数でない」。
-
[解決済み】execvp: バッドアドレスエラー
-
[解決済み】配列型char[]が代入できない [重複]。