代码 https://github.com/abhisharma7/WiscKey 存在bug,
导致:
1.value不一致
2.程序运行中断,错误:double free
出错原因
经过调试,找出了原因
再 wisckey_test.cc 的74行
fwrite (&value, sizeof(value),1,wk->logfile);
是一个错误的写法。
因为value是一个类(string类),而不是一个基本类型。
既然是类,就包含了 构造,析构方法,还有一些指针信息等。
那么写到文件中的信息就包含了这些指针信息。
而通过 fread 读取出来的 string 类,也会重新把这些指针信息读出来。
这些指针信息当然已经失效了!
因此引发了严重后果,就是类再析构的时候,析构到了一个错误的地方!
因此才会运行中断,提示 double free
修改办法
将string换成char [] 类型即可
put的部分修改成如下
long offset = ftell (logfile);
long size = value.length() + 1;
std::string vlog_offset = std::to_string(offset);
std::string vlog_size = std::to_string(size);
std::stringstream vlog_value;
vlog_value << vlog_offset << "&&" << vlog_size;
std::string s = vlog_value.str();
char *value_to_write = new char[size];
value.copy(value_to_write, size-1);
value_to_write[size - 1] = '\0';
fwrite (value_to_write, sizeof(char),size,logfile);
delete [] value_to_write;
Get的部分修改成如下:
std::string value_offset;
std::string value_length;
std::string s = *offsetinfo;
std::string delimiter = "&&";
size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
token = s.substr(0, pos);
value_offset = token;
s.erase(0, pos + delimiter.length());
}
value_length = s;
if (value_offset.empty() || value_length.empty())
return false;
std::string::size_type sz;
long offset = std::stol (value_offset,&sz);
long length = std::stol (value_length,&sz);
if (0 == length)
return false;
char* value_record = new char[length];
fseek(logfile,offset,SEEK_SET);
fread(value_record,sizeof(char),length,logfile);
delete [] value_record;