gpt4 book ai didi

c - 使用无效命令的 fork 导致 valgrind 中的内存泄漏

转载 作者:IT王子 更新时间:2023-10-29 01:25:48 25 4
gpt4 key购买 nike

我有以下代码,它在 fork 中执行无效命令。以下代码在 valgrind 中返回内存泄漏。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include <unistd.h>


int external_cmd(char **argv)
{
int pid;

if ((pid = fork()) == -1)
return -1;

if (pid == 0) {
/* child */
execvp(argv[0], argv);
exit(0);

} else if (pid < 0)
return -1;

int status;
while (wait(&status) != pid);

return 0;
}

int main ()
{
char *argv[8] = {0};
argv[0] = "tawtaw"; //<--------- invalid command
argv[1] = "-a";

char *mem = strdup("anychar");

/* fork call */
external_cmd(argv);

free(mem);

return(0);
}

用 valgrind 返回执行上面的代码:

$ valgrind --leak-check=full --show-leak-kinds=all ./test
==11573== Memcheck, a memory error detector
==11573== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==11573== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==11573== Command: ./test
==11573==
==11574==
==11574== HEAP SUMMARY:
==11574== in use at exit: 8 bytes in 1 blocks
==11574== total heap usage: 1 allocs, 0 frees, 8 bytes allocated
==11574==
==11574== 8 bytes in 1 blocks are still reachable in loss record 1 of 1
==11574== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11574== by 0x4EBF729: strdup (strdup.c:42)
==11574== by 0x400747: main (in /home/mohamed/Desktop/tech/test/test)
==11574==
==11574== LEAK SUMMARY:
==11574== definitely lost: 0 bytes in 0 blocks
==11574== indirectly lost: 0 bytes in 0 blocks
==11574== possibly lost: 0 bytes in 0 blocks
==11574== still reachable: 8 bytes in 1 blocks
==11574== suppressed: 0 bytes in 0 blocks
==11574==
==11574== For counts of detected and suppressed errors, rerun with: -v
==11574== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==11573==
==11573== HEAP SUMMARY:
==11573== in use at exit: 0 bytes in 0 blocks
==11573== total heap usage: 1 allocs, 1 frees, 8 bytes allocated
==11573==
==11573== All heap blocks were freed -- no leaks are possible
==11573==
==11573== For counts of detected and suppressed errors, rerun with: -v
==11573== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

注意:如果我使用有效命令“ls”而不是“tawtaw”执行代码,则 valgring 不会返回内存泄漏。

我缺少什么?

最佳答案

这是意料之中的。当 execve() 无法执行命令时,它将控制权返回给您的代码,然后您退出并且永远不会从 strdup() 中释放内存。

execve 成功时,整个文件图像被替换,并且用 strdup() 分配的内存没有任何剩余。

关于c - 使用无效命令的 fork 导致 valgrind 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41126905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com