gpt4 book ai didi

c - 应该返回 -1 的 sprintf 编码错误是什么?

转载 作者:行者123 更新时间:2023-12-03 07:37:57 35 4
gpt4 key购买 nike

我明白 snprintf 时将返回负值“发生编码错误”
但是这样一个简单的例子是什么 “编码错误”那会产生那个结果?
我正在与 一起工作gcc 10.2.0 C 编译器,我尝试过格式错误的格式说明符、不合理的大数字字段长度,甚至空格式字符串。

  • 格式错误的格式说明符只是按字面打印
  • 不合理的大数作为长度说明符会产生 fatal error
  • 空格式字符串也会产生 fatal error

  • 这涉及重复执行以下操作:
    length += snprintf(...
    建立一个格式化的字符串。
    如果确定不会返回负值,那可能是安全的。
    将缓冲区指针前移一个负长度可能会导致它越界。但我正在寻找一个真正发生这种情况的案例。如果存在这种情况,则可能需要增加其复杂性:
    length += result = snprintf(...
    到目前为止,我找不到值得为检查编译器可能永远不会产生的值增加复杂性的场景。也许你可以举一个简单的例子。

    最佳答案

    What is an encoding error for sprintf that should return -1?


    在我的机器上, "%ls"不喜欢 0xFFFF - 当然是编码错误。
      char buf[42];
    wchar_t s[] = { 0xFFFF,49,50,51,0 };
    int i = snprintf(buf, sizeof buf, "<%ls>", s);
    printf("%d\n", i);
    输出
    -1

    下面的代码返回-1,但不是因为编码错误而是病理格式。
    #include <stdio.h>

    int main() {
    size_t n = 0xFFFFFFFFLLu + 1;
    char *fmt = malloc(n);
    if (fmt == NULL) {
    puts("OOM");
    return -42;
    }
    memset(fmt, 'x', n);
    fmt[n - 1] = '\0';
    char buf[42];
    int i = snprintf(buf, sizeof buf, fmt);
    printf("%d %x\n", i, (unsigned) i);
    free(fmt);
    return 7;
    }
    输出
    -1 ffffffff

    当传递一个太大的尺寸时,我确实得到了一个令人惊讶的 -1,即使 snprintf()只需要 6 个字节。
      char buf[42];
    int i = snprintf(buf, 4299195472, "Hello");
    printf("%d\n", i);
    输出
    -1

    我想出了一个简短的例子,在 *fprintf() 上返回 -1至 stdout由于方向冲突。
    #include <wchar.h>
    #include <stdio.h>

    int main() {
    int w = wprintf(L"Hello wide world\n");
    wprintf(L"%d\n", w);
    int s = printf("Hello world\n");
    wprintf(L"%d\n", s);
    }
    输出
    Hello wide world
    17
    -1

    关于c - 应该返回 -1 的 sprintf 编码错误是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65334245/

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