这类险有没有双倍不赔险?

is there any double free risk in this class

本文关键字:有没有      更新时间:2023-10-16

我写了一个简单的Buffer类,它包含一个缓冲区,并提供一个函数来反转缓冲区的内容。

Buffer.h

#ifndef __BUFFER_H__
#define __BUFFER_H__
#include <stdlib.h>
#include <cerrno>
#include <stdio.h>
class Buffer
{
private:
  char * buffer;
  int size;

public:
    Buffer(int size);
  ~Buffer();
  void reverse(int size);
};
#endif

Buffer.cc

#include "Buffer.h"

Buffer::Buffer(int size)
{
  this -> size = size;
  this -> buffer = (char *)malloc(size);
  if(this -> buffer == NULL)
    throw 1;
}
Buffer::~Buffer()
{
  if(this -> buffer != NULL)
    free(this -> buffer);
}
void Buffer::reverse(int size)
{
  char tmp;
  int i;
  char * tmpb = this -> buffer;
  for(i = 0; i < size / 2; i++)
  {
    tmp = (char)tmpb[i];
    tmpb[i] = tmpb[size - i - 1];
    // printf("exchange %x with %xn", tmp & 0xff, tmpb[i] & 0xff);
    tmpb[size - i - 1] = tmp;
  }
}

有一个远程服务器来测试我的实现使用故障注入。该服务器给我报告,有错误造成的双重免费或腐败。我已经多次阅读我的实现,但没有运气找到错误。我无法访问那个服务器。任何帮助吗?

注意:我必须使用C风格的代码。否则服务器测试就会失败。这是一个很难的要求。好吧,你可能认为这个要求很愚蠢。但这是必须的。也许当有人把C和c++混在一起的时候,你会学到不好的东西。

服务器提供了一个main函数来测试我的实现。

对于任何想要查看所有代码的人,您可以从https://mega.nz/#!FhoHQD5Y!iD9tIZMNtKPpxfZTpL2KWoUJRedbw6wToh6QfVvzOjU下载zip文件。只需使用make编译即可。结果是一个名为rcopy的程序,它一个字节一个字节地反转文件的内容,然后输出到一个新文件。

考虑禁止显式复制,如果允许编译器生成隐式复制构造函数,那么它可以通过共享缓冲区指针的两个对象进行double free。否则,我看不出有可能发生双重自由。您可以在c++ 11中这样做:

class Buffer {
private:
    char *buffer;
    int size;
public:
    Buffer(int size);
    Buffer(const Buffer &) = delete;
    Buffer &operator=Buffer(const Buffer &) = delete;
    ~Buffer();
    void reverse(int size);
};

注意事项:

1。

free(NULL)被标准定义为非操作。所以

if(this -> buffer != NULL)
    free(this -> buffer);

可以是:

free(this -> buffer);

2。

tmp = (char)tmpb[i];

为什么在这里强制转换?tmpb[i]应该已经是char了。一般的经验法则是,大多数时候你觉得有必要使用cast,这可能意味着有更好的方法来完成任务。当然也有例外,但是干净的代码应该有最小的类型转换。

3。

有什么理由不使用std::swap(tmpb[size - i - 1], tmpb[i])在你的反向函数?

相关文章: