valgrind错误:Syscall param write(buf) points to uninitialised bytes(s)

最近使用valgrind检查代码时,发现了一个比较鬼诡的bug:Syscall param write(buf) points to uninitialised bytes(s) 。在百度上找了很长时间的解决方法,但没有找到。最后用google搞清楚了原因,并解决了这个问题。

这是我主要参考的英文网站:http://comments.gmane.org/gmane.comp.debugging.valgrind/7856

由于对齐等原因,我们定义变量等时应该先用memset对其进行初始化。然后再进行write、fwrite等调用。下面是一个具体的例子和其解决方法。

#include <stdio.h>
#include <string.h>

struct mystruct {
	char name[8];
};

int main()
{
	struct mystruct s;

	FILE *f;
	strcpy(s.name, "12345");
	f = fopen("test.dat", "wb");
	fwrite(&s, 1, sizeof(s), f);
	fclose(f);
	return 0;
}

上述代码用valgrind运行时会报Syscall param write(buf) points to uninitialised bytes(s) 错误。原因是我们调用fwrite时是向其写入8个字节,而只有前6个字节被明确赋值了。

解决方法1:加入memset进行清0.

#include <stdio.h>
#include <string.h>

struct mystruct {
	char name[8];
};

int main()
{
	struct mystruct s;
	memset(&s, 0, sizeof(s));
	FILE *f;
	strcpy(s.name, "12345");
	f = fopen("test.dat", "wb");
	fwrite(&s, 1, sizeof(s), f);
	fclose(f);
	return 0;
}

解决方法2:用strlen(s.name + 1),刚好写入这么多字节数,代码如下:

#include <stdio.h>
#include <string.h>

struct mystruct {
	char name[8];
};

int main()
{
	struct mystruct s;
	memset(&s, 0, sizeof(s));
	FILE *f;
	strcpy(s.name, "12345");
	f = fopen("test.dat", "wb");
	fwrite(&s, 1, sizeof(s.name) + 1, f);
	fclose(f);
	return 0;
}

这样问题就解决啦。。。

原创文章,转载请注明:http://blog.csdn.net/zhang2010kang

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-22 02:01:30

valgrind错误:Syscall param write(buf) points to uninitialised bytes(s)的相关文章

Syscall param open(filename) points to unaddressable byte(s)

valgrind 调试出现如题所示的错误,原因是存取文件名的空间被释放了 源代码: cfg->snteam_cfg->snt.score.nd.wrd_dict_db_fn=cfg->wrd_dict_db_fn: 修改之后: cfg->snteam_cfg->snt.heap = wtk_heap_new(1024); cfg->snteam_cfg->snt.score.nd.wrd_dict_db_fn= wtk_heap_dup_str(cfg->s

解决MYSQL的错误:Got a packet bigger than &#39;max_allowed_packet&#39; bytes

Mysql 5.1开始遇到的信息包过大问题,当用客户端导入数据的时候,遇到错误代码: 1153 - Got apacket bigger than 'max_allowed_packet' bytes,数据库终止了数据导入的操作. 原因分析:MYSQL限制了每次执行插入操作的数据最大值,超过最大值则报以上错误. 深度研究后发现: 数据库客户端和数据库服务器端器均有自己的max_allowed_packet变量,因此,如你打算处理大的信息包,必须增加客户端和服务器上的该变量配置数值. 一般情况下,

Spring错误——Spring 注解——factory-bean reference points back to the same bean definition

背景:学习Spring,在使用注解@Bean的name属性配置<bean>实例时,不能注册实例成功 报错 WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'config

Python错误TypeError: write() argument must be str, not bytes

2016-07-03 20:51:25 今天使用Python中的pickle存储的时候出现了以下错误: TypeError: write() argument must be str, not bytes 网上搜索才发现原来是文件打开的方式有问题. 之前文件打开的语句是: f=open("list.pkl","w+") 然后使用二进制方式打开就没有这个问题: f=open("list_account.pkl","wb+") 产

Python 读写文件 中文乱码 错误TypeError: write() argument must be str, not bytes+

今天写上传文件代码,如下 def uploadHandle(request): pic1=request.FILES['pic1'] picName=os.path.join(settings.MEDIA_ROOT,pic1.name) with open(picName,'w') as pic: for c in pic1.chunks(): pic.write(c) return HttpResponse(picName) 出现TypeError: write() argument must

valgrind的使用、原理

valgrind支持的工具:memcheck  addrcheck cachegrind Massid helgrind  Callgrind 运行时必须指明想用的工具,如果省略工具名,默认运行memcheck 1,memcheck 1),使用未初始化的内存 2),读/写已经被释放的内存 3),读/写内存越界 4),读/写不恰当的内存栈空间 5),内存泄露,指向一块内存的指针永远丢失 6),使用malloc/new/new[]和free/delete/delete[]不匹配 7),memcpy(

select引起的服务端程序崩溃问题

现象: 某个线上的服务最近频繁崩溃.该服务使用C++编写,是个网络服务端程序.作为TCP服务端,接收和转发客户端发来的消息,并给客户端发送消息.该服务跑在CentOS上,8G内存.线上环境中,与客户端建立的TCP连接大约在3~4万左右. 使用GDB查看每次崩溃产生的core文件,发现崩溃时的函数调用栈每次都各不相同,而且有时会发生在比较奇怪的地方,比如标准库std::string的析构函数中. 该线上服务崩溃之后,会有监控进程进行重启,因此暂时不会造成太大的影响. 复现: 先尝试在自己的虚拟机环

使用valgrind定位内存泄露

简单备忘一下,valgrind的用法: valgrind --tool=memcheck --leak-check=full --log-file=a.log ./a.exe 其中: --tool指定工具: --leak-check指定检测级别: --log-file指定输出到文件,不给出这个字段则输出到屏幕打印. valgrind的错误含义:(转自http://blog.csdn.net/ai2000ai/article/details/51131645) Conditional jump o

Java Web 错误/异常处理页面

发生服务器 500 异常,如果默认方式处理,则是将异常捕获之后调到 Tomcat 缺省的异常页面,如下图所示. 不论哪个网站都是一样的,所以为了满足自定义的需要,Tomcat 也允许自定义样式的.也就是在 web.xml 文件中配置: <error-page> <error-code>500</error-code> <location>/error.jsp</location> </error-page> 首先说说自带的逻辑.如果某