4

私はバグのあるプログラムを作成しました - buggy.c - これはバッファ t のバッファ オーバーフロー シナリオです。5 つ以上のインデックスを書いていることがわかります。それは正常に動作します。エラーが発生することはありません。ふと思ったのですが、どうしてこうなったのでしょう?Valgrindでも試しましたが、これもこの問題を見つけることができませんでした。ここで何が問題なのか教えてください。

void buffer_overflow(void)
    {
      int t[5];
      int i = 0;

      for(i = 0; i<=7; i++)
      {
        t[i] = i;  

      }


      /** this will cause buffer overflow **/   
      printf("Memory_overflow_completed\r\n");

    }


    int main(int argc, char **argv)
    {

      buffer_overflow();

      return 0; 
    }

    $gcc -g buggy.c -o buggy.out -lefence

$./buggy.out

ただし、クラッシュは発生しません。ここでは電気柵の効果はありません。私は何が欠けていますか?ここに投稿された同様の質問を見ましたgcc with electric fence library does not take effectですが、まだ回答がないようです。この例を FC19 で実行しています。誰もそれに対する答えを持っていますか?valgrind でさえ問題を検出できませんか? これらの問題を検出する他のツールはありますか?

さらなるコメントに基づいて、Electric Fence によって検出されるようにバッファ オーバーフロー関数を修正しました。ただし、Electric Fence は問題を検出できません。これが変更された関数です。

void buffer_overflow(void)
{

  #if 0
  int t[5];
  int i = 0;

  for(i = 0; i<=7; i++)
  {
    t[i] = i;  

  }
  #endif

  char *t = malloc(sizeof(char)*7);
  strcpy(t,"SHREYAS_JOSHI");


  /** this will cause buffer overflow **/   
  printf("Memory_overflow_completed\r\n");
  free(t);

}

[joshis1@localhost blogs-tune2wizard]$ gcc -g buggy.c  -o buggy.out -lefence

[joshis1@localhost blogs-tune2wizard]$ ./buggy.out 

  Electric Fence 2.2.2 Copyright (C) 1987-1999 Bruce Perens <bruce@perens.com>
Memory_overflow_completed

Electric Fence では検出されたエラーはありませんが、Valgrind では少なくともエラーが表示されました。

4

5 に答える 5

3

実行valgrind --tool=exp-sgcheck ./buggy.outすると、ローカル変数内でバッファオーバーランが発生したことを検出できるはずですt[5]

于 2013-10-07T05:51:51.757 に答える
0

Valgrind と EF は、動的に割り当てられたメモリでエラーを検出します。配列は動的に割り当てられていません。

于 2013-10-06T10:27:15.587 に答える