将内存泄漏检查集成到 C 代码中以进行自动分级
Posted
技术标签:
【中文标题】将内存泄漏检查集成到 C 代码中以进行自动分级【英文标题】:Integrating check on memory leak into C code for autograding 【发布时间】:2022-01-19 06:32:09 【问题描述】:我想在我的 C 代码中集成一个标志,例如如果发生内存泄漏,则为 1,否则为 0。我需要这种功能来对我正在教授的课程中的学生作业进行自动评分。我不需要知道 哪里 内存泄漏,只需要知道是否发生在可执行文件的运行时。对于信息跟踪/调试,Valgrind 是我的首选,但我不愿意解析 Valgrind 文本输出以进行评分。
我已经尝试过:
mcheck.h
- mtrace()
需要使用一个环境变量,由于我的自动测试设置(并且让一组 300 名一年级学生运行 shell 命令,他们对这些命令有一种奇怪的抵抗力)而变得有点麻烦
malloc.h
- mallinfo()
在内存清理可执行文件上的信息与我为特定内存清理可执行文件运行时的信息相同
【问题讨论】:
你可以考虑github.com/vmware/chap 谢谢!它看起来有点“重”,无法轻松打包以供学生个人使用(例如在他们的个人机器上)。我想我一直希望有人知道一个mallinfo()
技巧,可以给我我需要的信息:(
【参考方案1】:
检查 valgrind 的返回值。默认情况下,valgrind 返回被测进程返回的任何内容。但是如果 valgrind 检测到错误,可以将其更改为返回特定值。
valgrind manual 解释得最好:
--error-exitcode= [默认值:0]
指定在 Valgrind 报告运行中的任何错误时返回的替代退出代码。当设置为默认值(零)时,Valgrind 的返回值将始终是被模拟过程的返回值。当设置为非零值时,如果 Valgrind 检测到任何错误,则返回该值。这对于将 Valgrind 用作自动化测试套件的一部分很有用,因为它可以很容易地检测到 Valgrind 报告错误的测试用例,只需检查返回码。
【讨论】:
嗯,这很有帮助,谢谢。理想情况下,我还想提供一个 .c 文件,学生可以将其作为测试套件的一部分进行编译,这样他们就可以在提交之前运行测试(并且他们可以在那里收到内存是一个问题的消息)。我会明确要求他们运行 Valgrind,但我认为将它捆绑到我的测试器中会很可爱...... @bobthefairycat 没有什么能阻止你为 valgrind 编写一个只返回 PASS 或 FAIL 的包装器。 有趣,我会调查的。谢谢!以上是关于将内存泄漏检查集成到 C 代码中以进行自动分级的主要内容,如果未能解决你的问题,请参考以下文章