Это выглядит как ложный положительный результат со стороны CBMC.
Мы видим, что основной поток будет изменять a[0]
, a[1]
, b[0]
и b[1]
.
Тема thr1
изменяет a[2]
, a[3]
, b[2]
и b[3]
.
На самом деле нет никакого перекрывающегося доступа между потоками, и поэтому эта программа должна вести себя так, как будто она запускается последовательно.
Трассировка ошибок, создаваемая CBMC, также не имеет большого смысла:
Counterexample:
State 19 file test.c line 27 function main thread 0
----------------------------------------------------
thr1=1ul (00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001)
State 22 file test.c line 28 function main thread 0
----------------------------------------------------
thread=&thr1!0@1 (00000010 00000000 00000000 00000000 00000000 00000000 00000000 00000000)
State 23 file test.c line 28 function main thread 0
----------------------------------------------------
attr=((union pthread_attr_t { char __size[56l]; signed long int __align; } *)NULL) (00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000)
State 24 file test.c line 28 function main thread 0
----------------------------------------------------
start_routine=func1 (00000011 00000000 00000000 00000000 00000000 00000000 00000000 00000000)
State 25 file test.c line 28 function main thread 0
----------------------------------------------------
arg=NULL (00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000)
State 47 file test.c line 29 function main thread 0
----------------------------------------------------
me=NULL (00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000)
State 48 file test.c line 8 function func thread 0
----------------------------------------------------
i=0 (00000000 00000000 00000000 00000000)
State 49 file test.c line 9 function func thread 0
----------------------------------------------------
i=0 (00000000 00000000 00000000 00000000)
State 51 file test.c line 10 function func thread 0
----------------------------------------------------
b[0l]=0 (00000000 00000000 00000000 00000000)
State 52 file test.c line 10 function func thread 0
----------------------------------------------------
a[0l]=0 (00000000 00000000 00000000 00000000)
State 54 file test.c line 9 function func thread 0
----------------------------------------------------
i=1 (00000000 00000000 00000000 00000001)
State 57 file test.c line 10 function func thread 0
----------------------------------------------------
b[1l]=1 (00000000 00000000 00000000 00000001)
State 58 file test.c line 20 function func1 thread 1
----------------------------------------------------
b[2l]=2 (00000000 00000000 00000000 00000010)
State 59 file test.c line 20 function func1 thread 1
----------------------------------------------------
a[2l]=2 (00000000 00000000 00000000 00000010)
State 61 file test.c line 19 function func1 thread 1
----------------------------------------------------
i=3 (00000000 00000000 00000000 00000011)
State 64 file test.c line 10 function func thread 0
----------------------------------------------------
a[1l]=0 (00000000 00000000 00000000 00000000)
Violated property:
file test.c line 11 function func
assertion a[i] == i
a[(signed long int)i] == i
VERIFICATION FAILED
Этот встречный пример утверждает, что a[1] == 0
. Однако состояние 64 показывает, что 0
присваивается a[1]
, хотя последнее записанное значение b[1]
равно 1
в состоянии 57.