这类险有没有双倍不赔险?
is there any double free risk in this class
我写了一个简单的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])
在你的反向函数?
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 遇到新行时,有没有办法停止istream_iterator
- 有没有一种方法可以在编译时获得作用域类名
- conan有没有办法导出一个空目录
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有可能有一个只有ADL才能找到的非好友功能
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- catch框架有没有办法比较流或文件
- 有没有任务栏API可以立即应用注册表更改
- 铸造标准::有没有回到原来的类型
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践