gpt4 book ai didi

c - 使用 snprintf 避免缓冲区溢出

转载 作者:太空狗 更新时间:2023-10-29 16:30:06 25 4
gpt4 key购买 nike

我正在像这样使用 snprintf 来避免缓冲区溢出:

char err_msg[32] = {0};
snprintf(err_msg, sizeof(err_msg) - 1, "[ ST_ENGINE_FAILED ]");

我添加了 -1 来为空终止符保留空间,以防字符串长度超过 32 个字节。

我的想法正确吗?

平台:

  • 海湾合作委员会 4.4.1
  • C99

最佳答案

正如其他人所说,在这种情况下您不需要 -1。如果数组是固定大小,我会改用 strncpy。它是为复制字符串而制作的 - sprintf 是为进行困难的格式化而制作的。但是,如果数组的大小未知,或者您正在尝试确定格式化字符串需要多少存储空间。这就是我真正喜欢 snprintf 的标准指定版本的地方:

char* get_error_message(char const *msg) {
size_t needed = snprintf(NULL, 0, "%s: %s (%d)", msg, strerror(errno), errno);
char *buffer = malloc(needed+1);
sprintf(buffer, "%s: %s (%d)", msg, strerror(errno), errno);
return buffer;
}

将此功能与 va_copy 相结合,您可以创建非常安全的格式化字符串操作。

关于c - 使用 snprintf 避免缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1775403/

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