人们如何处理泄漏内存的错误POSIX API?

时间:2011-01-24 03:08:23

标签: posix valgrind system-calls

免责声明:这是一项作业,但作业并不要求我们删除内存泄漏。我只是肛门保持这个。

考虑以下方法:

//Prints the current user ID to the console.
void PrintUserId()
{
        std::cout << "Current User Id: " << cuserid(0) << std::endl;
}

cuserid州的文档:

  

如果string不是空指针,它应该是一个至少可以容纳L_cuserid字符的数组;字符串在此数组中返回。否则,返回指向静态区域中字符串的指针。

但至少在我的系统上,所讨论的内存似乎没有静态分配(或者至少存在错误......):

(Valgrind Output)
==4488== 160 (40 direct, 120 indirect) bytes in 1 blocks are definitely lost in loss record 11 of 11
==4488==    at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==4488==    by 0x4247A9C: nss_parse_service_list (nsswitch.c:622)
==4488==    by 0x4248216: __nss_database_lookup (nsswitch.c:164)
==4488==    by 0x402DEAB: ???
==4488==    by 0x402EB6C: ???
==4488==    by 0x41FE41C: getpwuid_r@@GLIBC_2.1.2 (getXXbyYY_r.c:253)
==4488==    by 0x41A2785: cuserid (cuserid.c:38)
==4488==    by 0x80495A3: PrintUserId() (in /home/bro4/Assignment1.bin)
==4488==    by 0x8049A11: ParentProcess() (in /home/bro4/Assignment1.bin)
==4488==    by 0x8049B53: main (in /home/bro4/Assignment1.bin)

我只是坚持这个吗?

2 个答案:

答案 0 :(得分:3)

这可能是误报。 cuserid或其依赖项可以在其第一次调用时分配缓冲区,然后在下次调用时释放或重用它。尝试循环调用它;你最终得到了多个泄漏报告吗?

在您的情况下,分配由nss_parse_service_list完成,__nss_database_lookup是nsswitch内部API的一部分,用于处理各种身份验证提供程序(unix / etc / passwd,LDAP等)之间的切换。此函数由suppress these reports调用,它将其作为一次性初始化过程的一部分进行调用。所以这不是真的泄漏;它的内存被分配用于保存解析配置文件的结果(或者,在这种情况下,是默认配置)。它不会被释放,因为它需要在程序终止之前;但它也不会增长。

由于这是误报,您可能希望在valgrind中{{3}}。从系统库中看到valgrind警告的情况并不少见 - 在各种库例程中都有这样的一次性分配,以及低级例程做一些看似valgrind的事情就像一个潜在的问题,实际上他们非常小心控制和纠正。最好是压制它们 - 当然,当然,当然,确认它们不是你的错!

答案 1 :(得分:1)

Single UNIX ® Specification, Version 2并不能保证会使用静态数据,它会说它可能是静态的......#/ p>

  

如果s是空指针,则为此   表示在一个区域中生成   这可能是静态的(因此   被后来的电话覆盖   cuserid()),其地址是   返回。

cuserid()的linux手册页有两个挑衅性的陈述:

  

cuserid功能包含在1988版的POSIX中,但已从1990版本中删除。

  

没有人确切知道cuserid()的作用 - 避免使用它   程序 - 完全避免 - 使用   相反,getpwuid(geteuid())   就是你          意思。不要使用cuserid()。

假设超过20年前从POSIX中删除此功能的说法是准确的,我会说&#34;不要使用cuserid()&#34;是很好的建议。如果做不到这一点,将指针传递给cuserid并自己管理内存。