Wisckey 错误代码修复

Wisckey项目中存在一个bug,由于在wisckey_test.cc的74行将string对象错误地用fwrite写入文件,导致读取时析构失效的指针,从而引发double free错误。解决方案是将string替换为char []类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码 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;
	
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值