質問: オーバーフローについてです。 "#include int main(){ char str[16]; scanf("%s", str); printf("%s", str); putchar('\n'); return 0; } こんな感じのプログラムに 12345678901234567890123 とパラメータを渡したら、何も起きなかったのですが、 123456789012345678901234 とパラメータを渡したら、 Abort trap: 6 と出現しました。 オーバーフローのテストのつもりでやったのですが、何が起きているのかサッパリ分からないのです。これで、オーバーフローは起きているのでしょうか? 一回目は起きていそうもないのですが・・・ 16個配列がありながら23個のパラメータを渡しても何も起きていないのですが・・・・ なぜ、パラメータを24個でAbort trapと出てきたのでしょうか?? mac OS と gcc コンパイラを使用しています。 ヒープオーバーフローやスタックオーバーフロー以外にどんな種類のオーバーフローが存在しますか?
回答: > > なぜ、パラメータを24個でAbort trapと出てきたのでしょうか?? > > > たまたまです。 23個のときはたまたまエラーにならなかったし、24個のときはたまたまエラーになったようです。 あらかじめ用意した領域を超えた場所に値を入れているので、何が起きてもおかしくありません。 別の環境や別のタイミングでやればまた違った結果になると思います。 > > オーバーフローは起きているのでしょうか? > > > オーバーフローの意味を誤解しているのかなと思います。 一般的にオーバーフローとは、ある型に対して表現できない大きな値を格納した場合、オーバーフローと呼びます。 逆に表現できないほど小さい値を入れたときは、アンダーフローになります。 今回の場合は用語としては`メモリ破壊`が適切かと思います。