gpt4 book ai didi

c - snprintf 手册页示例内存泄漏?

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

snprintf(3) 的 Linux 手册页给出了以下示例:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

char *
make_message(const char *fmt, ...)
{
int n;
int size = 100; /* Guess we need no more than 100 bytes */
char *p, *np;
va_list ap;

if ((p = malloc(size)) == NULL)
return NULL;

while (1) {

/* Try to print in the allocated space */

va_start(ap, fmt);
n = vsnprintf(p, size, fmt, ap);
va_end(ap);

/* Check error code */

if (n < 0)
return NULL;

/* If that worked, return the string */

if (n < size)
return p;

/* Else try again with more space */

size = n + 1; /* Precisely what is needed */

if ((np = realloc (p, size)) == NULL) {
free(p);
return NULL;
} else {
p = np;
}
}
}

/* 检查错误代码 */ 之后不应该是:

        if (n < 0) {
free(p);
return NULL;
}

为了避免内存泄漏?

我不能发布这个,因为字码比例不正确,所以我必须在最后添加更多的文字。请忽略这一段,因为上面的内容很完整而且很重要。我希望这是足够的文本可以被接受。

顺便说一句:我喜欢最后一行 p = np;

最佳答案

是的,这段代码有漏洞。

vsnprintf 可以在出错时返回负数。在 VC++ 中,当目标缓冲区太小时,vsnprintf 返回 -1,这打破了这段代码中的逻辑......看这里: MSDNVC 实现不符合 C 标准...

vsnprintf 失败的其他来源是发送 NULL“格式”缓冲区或格式缓冲区中的错误编码。

关于c - snprintf 手册页示例内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19933479/

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