gpt4 book ai didi

c - 在一个 printf() 中使用 strerror() 两次不同的值会触发 Windows 上的错误

转载 作者:行者123 更新时间:2023-12-05 00:51:31 25 4
gpt4 key购买 nike

根据 Microsoft 文档,API char * strerror(int errnum)

"maps errnum to an error-message string and returns a pointer to thestring"

在实践中发现有一个重要方面未在描述中涵盖:

  • 在 Windows 上,对于不同的 errnum 值,使用相同的指针。它导致了意外的行为:strerror() 在一个 printf() 中具有不同的 errnum 显示相同的值!

这是代表这种行为的代码:

printf("---------- print separately [OK] ----------\n");
printf("strerror(1)=(%s), ptr=(%p)\n", strerror(1), strerror(1));
printf("strerror(2)=(%s), ptr=(%p)\n", strerror(2), strerror(2));
printf("---------- print together [BUG] ----------\n");
printf("strerror(1)=(%s), strerror(2)=(%s)\n", strerror(1), strerror(2));
printf("ptr_1=(%p), ptr_2=(%p)\n", strerror(1), strerror(2));
printf("---------- print together, get pointers separately [BUG] ----------\n");
const char * s1 = strerror(1);
const char * s2 = strerror(2);
printf("strerror(1)=(%s), strerror(2)=(%s)\n", s1, s2);
printf("ptr_1=(%p), ptr_2=(%p)\n", s1, s2);
printf("---------- --------------------------- ----------\n");

输出:

---------- print separately [OK] ----------
strerror(1)=(Operation not permitted), ptr=(000002756DE6BD90)
strerror(2)=(No such file or directory), ptr=(000002756DE6BD90)
---------- print together [BUG] ----------
strerror(1)=(Operation not permitted), strerror(2)=(Operation not permitted)
ptr_1=(000002756DE6BD90), ptr_2=(000002756DE6BD90)
---------- print together, get pointers separately [BUG] ----------
strerror(1)=(No such file or directory), strerror(2)=(No such file or directory)
ptr_1=(000002756DE6BD90), ptr_2=(000002756DE6BD90)
---------- --------------------------- ----------

未使用编译器优化标志。相同的代码在带有 gcc 的 Linux 上也能正常工作。

更新:问题已得到解答。

问:这种行为是BUG吗?

  • 没有。

问:还有其他更好的 API 可以在 Linux 上用作 strerror 吗?

  • 是的。 strerror_s。

最佳答案

这不是错误。根据 strerror 的 POSIX 文档:

The returned string pointer might be invalidated or the string content might be overwritten by a subsequent call to strerror()

因此,如果您在单个语句中调用它两次,则不应期望多个值有效(并且您的代码崩溃或执行其他奇怪的事情是完全可以接受的)。

根本原因可能是因为 Microsoft C 库为 strerror 返回值使用单个固定缓冲区,因此每次调用都会覆盖先前保存的值。这是标准特别允许的,以便于实现。

关于c - 在一个 printf() 中使用 strerror() 两次不同的值会触发 Windows 上的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71680483/

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