我是比较新的调试Valgrind的错误,而这其中有我难住了:尺寸1 X的无效写入字节** **里面大小的块> X ** ** alloc'd
==1920== Invalid write of size 1
==1920== at 0x4C2ECC7: strcpy (/builddir/build/BUILD/valgrind-3.11.0/memcheck/../shared/vg_replace_strmem.c:506)
==1920== by 0x1D533B57: CSR_bullet (packages/tests-vg/vetr/src/cstringr.c:448)
... redacted (see end for full error)
==1920== Address 0x1bd1be1f is 5,599 bytes inside a block of size 7,960 alloc'd
==1920== at 0x4C2BBAD: malloc (/builddir/build/BUILD/valgrind-3.11.0/coregrind/m_replacemalloc/vg_replace_malloc.c:299)
==1920== by 0x4F3D3E: GetNewPage (svn/R-devel/src/main/memory.c:879)
... redacted (see end for full error)
请注意,这是字节井内和分配块。我已经看到类似的错误,涉及写入之后,或之前,或到free'd块,甚至写入写入大小大于块结束地址(因此溢出),但我找不到像这个。
这发生在R CRAN check farm在this line of code。
我无法在OSX或linux虚拟机上使用valgrind在本地重现错误。
除此之外,错误对我没有意义。为什么我不能在分配块的中间写入1个字节?这一切都在R内部运行,所以我猜可能我认为有问题的分配是由程序的一个不同部分产生的,并且它以某种方式保留下来(一种可能的提示是,发生这种情况的是我从R请求的分配小于60字节当错误出现时),但我不知道这是valgrind能够检测到的东西。
完整的错误:可使用内存池时发生
==1920== Invalid write of size 1
==1920== at 0x4C2ECC7: strcpy (/builddir/build/BUILD/valgrind-3.11.0/memcheck/../shared/vg_replace_strmem.c:506)
==1920== by 0x1D533B57: CSR_bullet (packages/tests-vg/vetr/src/cstringr.c:448)
==1920== by 0x1D53317D: CSR_bullet_ext (packages/tests-vg/vetr/src/cstringr-ext.c:107)
==1920== by 0x4852BD: do_dotcall (svn/R-devel/src/main/dotcode.c:1252)
==1920== by 0x4C274D: Rf_eval (svn/R-devel/src/main/eval.c:728)
==1920== by 0x4C3AB5: R_execClosure (svn/R-devel/src/main/eval.c:1617)
==1920== by 0x4C2391: Rf_eval (svn/R-devel/src/main/eval.c:747)
==1920== by 0x4C29E0: forcePromise (svn/R-devel/src/main/eval.c:520)
==1920== by 0x4C27A1: Rf_eval (svn/R-devel/src/main/eval.c:647)
==1920== by 0x4C7746: do_withVisible (svn/R-devel/src/main/eval.c:2998)
==1920== by 0x4F7104: do_internal (svn/R-devel/src/main/names.c:1363)
==1920== by 0x4B553B: bcEval (svn/R-devel/src/main/eval.c:6503)
==1920== Address 0x1bd1be1f is 5,599 bytes inside a block of size 7,960 alloc'd
==1920== at 0x4C2BBAD: malloc (/builddir/build/BUILD/valgrind-3.11.0/coregrind/m_replacemalloc/vg_replace_malloc.c:299)
==1920== by 0x4F3D3E: GetNewPage (svn/R-devel/src/main/memory.c:879)
==1920== by 0x4F5814: Rf_allocVector3 (svn/R-devel/src/main/memory.c:2659)
==1920== by 0x4CAEAF: Rf_allocVector (svn/R-devel/src/include/Rinlinedfuns.h:247)
==1920== by 0x4CAEAF: do_growconst (svn/R-devel/src/main/eval.c:7490)
==1920== by 0x4B64BD: bcEval (svn/R-devel/src/main/eval.c:6483)
==1920== by 0x4C2207: Rf_eval (svn/R-devel/src/main/eval.c:624)
==1920== by 0x4C3AB5: R_execClosure (svn/R-devel/src/main/eval.c:1617)
==1920== by 0x4BAE13: bcEval (svn/R-devel/src/main/eval.c:6454)
==1920== by 0x4C2207: Rf_eval (svn/R-devel/src/main/eval.c:624)
==1920== by 0x4C3AB5: R_execClosure (svn/R-devel/src/main/eval.c:1617)
==1920== by 0x4BAE13: bcEval (svn/R-devel/src/main/eval.c:6454)
==1920== by 0x4C2207: Rf_eval (svn/R-devel/src/main/eval.c:624)
有可能是消息的延续,它告诉当的方式块被删除/释放。 – Serge
那么它不会说“...大小7,960 free'd ...”吗?单词“free”不会出现在完整的输出I链接中。 – BrodieG
也许一个(未捕获的)前一个错误已经覆盖了一个内存控制块? – wildplasser