c - 为什么在传递函数“pthread_create()”后变量“sum”的值会发生变化?
问题描述
我声明了一个变体sum
并初始化为0,然后通过函数将它传递给func()
函数pthread_create()
。我没想到的是变体sum
不再等于0(如您所见,函数assert()
失败了)。我的 ubuntu 是 16.04.4 LTS。
直接用gcc编译就可以了, cbmc报错。
static void * func(void * arg)
{
double *sum = (double *)arg;
assert(*sum == 0.0); //failed in CBMC
return ((void *) 0);
}
int main(){
double sum=0.0;
pthread_t thr1;
pthread_create(&thr1, NULL, &func, (void *)&sum );
pthread_join(thr1, NULL);
printf("sum = %f\n", sum);
assert(sum == 0.0); //successful in CBMC
return 0;
}
以下是CBMC报告的警告:
State 70 file pthreads4.c line 24 function main thread 1
----------------------------------------------------
arg=&sum!0@1 (0000010000000000000000000000000000000000000000000000000000000000)
State 71 file pthreads4.c line 12 function func thread 1
----------------------------------------------------
sum=((double *)NULL) (0000000000000000000000000000000000000000000000000000000000000000)
State 72 file pthreads4.c line 12 function func thread 1
----------------------------------------------------
sum=&sum!0@1 (0000010000000000000000000000000000000000000000000000000000000000)
Violated property:
file pthreads4.c line 14 function func
assertion *sum == 0
IEEE_FLOAT_EQUAL(*sum, (double)0)
VERIFICATION FAILED
解决方案
推荐阅读
- android - 在应用内购买Andriod但付款被拒绝时的响应码是什么?为什么这么多被拒绝的订单根本没有任何响应代码?
- typescript - nestjs - neovim [import-prefix-missing no-local: Unable to load a local module] 错误
- javascript - slick-carousel 不适用于 MVC 的部分视图
- css - Angular + Bootstrap:将 Typescript 中的参数传递给样式表,并在 @if 中使用它来确定样式
- javascript - 如何给我的添加到购物车按钮自定义行为?
- javascript - 两个函数在被调用时都需要是异步的还是只是父函数?
- c# - 哪个 .config 文件用于测试 dll?
- r - 如何拆分使用 geom_boxplot 制作的箱线图?
- mysql - 使用连接显示mysql中两个表之间的差异
- php - Google 图表未使用 mpdf 和 codeigniter 3.x 以 pdf 格式导出