C言語学習ポータル(無料版) 学習コンテンツ つまずきとエラー strcpy でバッファをあふれさせる

🔤 文字列

strcpy でバッファをあふれさせる

どんなときに起きるか

実行時に *** stack smashing detected ***: terminated と出て Aborted (core dumped)。gcc は warning: '__builtin___strcpy_chk' writing 14 bytes into a region of size 8 overflows the destination [-Wstringop-overflow=] を出すことがあります。

なぜそうなるのか

strcpy はコピー先の大きさを知りません。char buf[8] に14バイト書き込めば、隣の変数や関数の戻り先アドレスまで上書きします。これがバッファオーバーフローで、攻撃の入口にもなります。

直し方・再発防止

snprintf(buf, sizeof buf, "%s", src); を既定の書き方にします。strncpy は終端を書かない場合があるので、使うなら buf[sizeof buf - 1] = '\0'; を添えます。サイズは必ず sizeof で書き、数字を直書きしないことが再発防止になります。

終わりの看板(4コマ漫画)
4コマで見る「終わりの看板」

アプリでしっかり学ぶ(無料・登録不要) つまずき一覧へ

同じ場面で起きやすいつまずき

ヌル終端 '\0' を忘れる%s で表示すると、狙った文字列の後ろに文字化けが延々と続きます。strlen が想定外の大きな値を返します。運… char配列に文字列を代入できないchar s[10]; s = "hello"; で gcc: error: assignment to exp… gets を使ってしまうgcc: warning: implicit declaration of function 'gets'(C2… 文字と文字列の混同('a' と "a")char c = "A"; で gcc: warning: initialization of 'char' f…

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH