"check library"を使ってmalloc(3)のチェックユニットテストを書いてみたいと思います。Cでmalloc()バッファオーバーランを作成する
このユニットテストでは、バッファオーバーランが発生しています。
- int変数(int * ptr = malloc(3))にdoubleを割り当てると、バッファオーバーランが発生しますか?
- intの最大値より大きな数値を割り当てるとどうなりますか?
バッファオーバーランの他の簡単な例を教えてください。
"check library"を使ってmalloc(3)のチェックユニットテストを書いてみたいと思います。Cでmalloc()バッファオーバーランを作成する
このユニットテストでは、バッファオーバーランが発生しています。
バッファオーバーランの他の簡単な例を教えてください。
malloc
によって割り当てられたバッファの末尾を越えて書き込みまたは読み取ると、undefined behaviorが生成されます。つまり、発生したときに特定の動作に依存することはできません。プログラムが動作しているように見えるか、コアダンプが発生するか、予期しない結果が出力されることがあります。
mallocのバッファをオーバーランすると未定義の動作が発生するため、特定の実装malloc
をテストしている場合を除き、テストケースを作成するのは無意味です。あなたの質問の言葉に基づいて、それはそうではないようです。
バッファをオーバーランするには、保証サイズ外のバッファにアクセスするか、バッファの先頭より前にバッファにアクセスする必要があります。割り当ては本当に可視バッファにはアクセスしないので、割り当てルーチン自体にバグがあったり構造が壊れていたりしない限り、どのような割り当てがバッファオーバーランになるかは分かりません。
int変数(つまり、int * ptr = malloc(3))にdoubleを割り当てると、バッファオーバーランが発生しますか?
いいえ、バッファがアクセスされていないため、いいえです。
intの最大値よりも大きな数値を割り当てるとどうなりますか?
いいえ、バッファがアクセスされていないため、いいえです。
バッファをオーバーランするには、バッファを用意してからオーバーランする必要があります。例えば:
int* j = malloc (2 * sizeof (int));
j[2] = 1;
ここでIは、2つの整数の空間とバッファを割り当て、第3整数アクセスし、それをオーバーラン(0が最初であるが、1はSO 2が第三である、秒)。
また、 'int i = j [2];'はバッファオーバーランですが、書き込み操作ではなく読み込みです。 'i = j [0];'や 'i = j [1];'のように、バッファオーバーランではなく、そうでなければOKでも、初期化されていないデータにもアクセスします。 –
数字の最大値がありますか?だから私は無限にint値に数字を書くことはできません。 – surveyCorps
私が言ったように、私のテストケースでは、バッファオーバーランが発生するはずです。私が割り当てているintポインタ(int * ptr = malloc(3))に大きな値を与える(つまり、* ptr = 59595959595959595959595959595)とすればいいですか?これはバッファオーバーランですか? – surveyCorps
あなたのプラットフォームで 'sizeof(int)> 3'の場合、バッファオーバーランです。そうでなければ、いいえ。 –