gpt4 book ai didi

配置检查线程安全错误号

转载 作者:太空宇宙 更新时间:2023-11-04 04:22:21 25 4
gpt4 key购买 nike

我们的软件中有一个问题报告,结果证明是由非线程安全-errno 引起的(由于 Solaris 上的编译器标志略有错误)。

我想添加一个配置检查以确保这种伪造的操作模式不会再次潜入。

我从一些相当幼稚的东西开始:

#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>

void* thread1_func(void*)
{
errno = 1;
return 0;
}

int
main ()
{
errno = 0;
pthread_t t1;
pthread_create(&t1, NULL, thread1_func, NULL);
pthread_join(t1, NULL);
return errno;
}

这在大多数平台上运行良好,除了在 OpenBSD 上 return errno 产生 2 - 即使 pthread_create/pthread_join 不接触 错误号。 (有趣的是,如果我在 pthread_create 之前插入一个 printf 调用,这就会消失,这使得调试变得非常困难。

我怀疑以这种方式访问​​ errno 在技术上是未定义的。

如何检查 errno 是否是线程安全的?

最佳答案

这段代码:

#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>

void* thread1_func(void*)
{
errno = 1;
return 0;
}

int
main ()
{
errno = 0;
pthread_t t1;
pthread_create(&t1, NULL, thread1_func, NULL);
pthread_join(t1, NULL);
return errno;
}

不是 errno 值或用法的有效测试。每the C standard , 7.5 错误 ,第 3 段:

... The value of errno may be set to nonzero by a library function call whether or not there is an error, provided the use of errno is not documented in the description of the function in this International Standard

换句话说,如果 C 标准没有明确说明它不能,即使没有错误,任何函数都可以自由修改 errno 的值。

errno 仅在记录为使用 errno 的库函数调用返回错误后立即有效。

关于配置检查线程安全错误号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45435987/

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