一例由于栈溢出导致valgrind报告Invalid write的错误

使用Valgrind检查新写好的代码,在调用函数a时,valgrind报告了一系列的Invalid write和Invalid read,警告所在行数就是函数a的定义位置,让人摸不着头脑。而且也不是每次调用a都会告警。

不经意间发现在Invalid write之前还有一个SP change的警告,在这个警告的提醒下发现函数a中一个局部变量数组特别大,达到了6MB,加上其它数据超过了栈空间linux默认为10M),在某些情况下会导致栈溢出,并导致一系列莫名其妙的问题,很难定位原因。

记录一下,引以为戒,局部变量如果出现一个大数组,一定考虑它的大小,可以考虑替换为静态变量,或者用malloc。

即使在代码中确认没有越界访问,Valgrind 仍然可能会报告 "Invalid write of size 8" 错误,这可能是由于以下原因之一: 1. 未初始化的内存:Valgrind 是内存错误检测工具,它会检查未初始化的内存访问。如果你在写入之前没有正确初始化目标内存区域,Valgrind报告错误。确保在使用 `memcpy` 或 `memset` 之前先正确初始化目标内存。 2. 内存重叠:如果源和目标内存区域有重叠部分,`memcpy` 可能会导致未定义行为。即使你认为没有越界访问,如果存在内存重叠,Valgrind 也会报告错误。确保源和目标内存区域没有重叠,可以使用 `memmove` 替代 `memcpy` 来处理可能存在的重叠情况。 3. 编译器优化:某些情况下,编译器可能会对代码进行优化,这可能导致 Valgrind 报告错误。你可以尝试禁用编译器优化,或者使用 `-Og`(适度优化)选项编译代码来减少这种情况的可能性。 4. Valgrind 的误报:有时候 Valgrind 会出现误报,报告一些实际上是正确的代码。这可能是由于 Valgrind 自身的限制或错误导致的。如果你确认代码是正确且没有越界访问,可以尝试减少对该错误的关注或排除 Valgrind 报告的特定错误。 总的来说,尽管 Valgrind 是一个强大的内存错误检测工具,但它也可能产生一些误报。确认代码正确性后,你可以考虑上述可能的原因,并适当地对代码进行调整或忽略 Valgrind报告
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值