0

私はこのコードを与えられました:

  class Record
    {
   private:
      unsigned short size_of_buffer;
      char* buffer;

   public:
      bool was_marked_as_deleted();
    };  


bool Record::was_marked_as_deleted(){

        if (buffer == NULL)
            return false;

        stringstream stream;
        stream.write(buffer,size_of_buffer);
        stream.seekg(0,stream.beg);

        unsigned short size_of_first_field = 0;
        stream.read( (char*)(&size_of_first_field) , sizeof(size_of_first_field) );

        if (size_of_first_field > 1)
            return false;

        char first_field = 1;
        stream.read( (char*)(&first_field) , sizeof(first_field) );
        if ( first_field != MARK_DELETED )
            return false;

        return true; 

    }

上記の関数は

  • stream.write(buffer,size_of_buffer);ラインのため、非常に非効率的です
  • 読めない。

memcpyそのため、代わりにを使用してリファクタリングしたいと思いstringstreamsます。これは私が思いついたものです:

bool Record::was_marked_as_deleted(){

    if(buffer==NULL)
        return false;

    unsigned short size_of_first_field= 0;
    memcpy(&size_of_first_field,buffer,sizeof(size_of_first_field));

    if (size_of_first_field > 1)
        return false;

    char first_field = 1;

    //This line produces valgrind error
    //EDIT: fixed it with the following IF statement
    if (size_of_buffer > sizeof(size_of_first_field))
         memcpy(&first_field,buffer+sizeof(size_of_first_field),sizeof(first_field));

    if (first_field != MARK_DELETED )
        return false;

    return true;
}

さて、問題は私のプログラムが正常に動作することですが、 で実行するとvalgrind、次のようになります。

==17340== Invalid read of size 1
==17340==    at 0x8059452: Record::was_marked_as_deleted() (Record.cpp:161)
==17340==  Address 0x5af2832 is 0 bytes after a block of size 2 alloc'd

どうしてこれなの?プログラムが valgrind では失敗するのに、通常の実行では失敗しないのはなぜですか?

4

1 に答える 1