バッファオーバーフロー
C言語やC++以外の言語ではバッファオーバーフローが発生しないよう対策が取られているものも多く、コンパイル時にバッファオーバーフローのチェックを行ったり、実行時にバッファオーバーフローに対する警告や例外を上げたりするものもある(Ada、Eiffel、LISP、Modula-2、Smalltalk、OCaml、およびC言語から派生したCycloneやD言語など)。
Javaプラットフォームや.NET Frameworkでは全ての配列に対して境界チェックが必須とされる。ほぼすべてのインタプリタ言語ではバッファオーバーフローへの対策が行われており、エラー発生時にはその状態が明確に伝えられる。境界チェックを行うのに十分な型情報を保持しているようなプログラミング言語では、境界チェックの有効・無効を切り替えるためのオプションが提供されていることもある。
典型的なスタックベースのバッファオーバーフロー攻撃では、本来データを格納すべき領域にシェルコードやNOP命令のような実行コードを置き、これをプログラムに実行させる事で攻撃が成立する。そこでこのような攻撃を防ぐため、データを格納すべき領域では実行不可にする、Write XOR eXecute(W ⊕ {\displaystyle {\boldsymbol {\oplus }}} XもしくはW^Xと略す)という対策手法が知られている。W ⊕ {\displaystyle \oplus } XのWindowsにおける実装はDEP(英: data execution prevention、データ実行防止)と呼ばれる。またDEPではSEH例外ハンドラへのポインタが上書きされないように明示的に保護を行う。 一部のUNIX(OpenBSDやmacOSなど)はW ⊕ {\displaystyle \oplus } Xなどの実行保護が有効になった状態で出荷されている。それ以外のオプショナルなパッケージとしては以下のものが挙げられる。
PaX
Exec Shield
Openwall
また、プロプライエタリなアドオンとしては以下のものがある。
BufferShield
StackDefender
なお、2018年現在広く使われているx64アーキテクチャのプロセッサでは、W ⊕ {\displaystyle \oplus } Xを実現する為にデータ領域である事を識別するNXビットという仕組みがハードウェアレベルでサポートされている(インテルではNXビットのことをXDビットと呼んでいるが同一のものである)。