Подробности

[В начало]

Проблема в реализации № D0131

Краткое описание

Функция XSyncValueSubtract делает неправильное вычитание двух значений

Подробное описание

Если в качестве уменьшаемого и вычитаемого взять одно и тоже значение, то функция XSyncValueSubtract не возвращает ожидаемое значение 0. При этом устанавливается overflow, и старший бит ненулевой.

Раздел стандарта

Linux Standard Base Desktop Specification 3.2. Chapter 6. Libraries. 6.11.5. X Synchronization Extension, который ссылается на http://refspecs.linux-foundation.org/X11/synclib.pdf

Пример

XSyncIntToValue(&a, 100); // a.hi = 0, a.lo = 100

XSyncValueSubtract(&result, &a, &a, overflow); 
printf("result.hi = %d, result.lo = %d, overflow = %d", result.hi, result.lo, overflow); 

// result.hi = -1, result.lo = 0 overflow is set to true

Способы устранения

В описании макроса _XSyncValueSubtract if (t>(presult)->lo) (presult)->hi--;\ заменяется на if (t<(presult)->lo) (presult)->hi--;\ А именно, знак '>' поменять на '<'.

Компонент

X11 7.3 or early

Принято

bugzilla.freedesktop.org 23438

Статус

Исправлено в xextproto git

[В начало]