QVariantAnimation: fix UB (FP 0/0) in interpolated() arg calculation
When startProgress, endProgress, and progress were all 0 (as provoked by tst_QPropertyAnimation::startWithoutStartValue()), we'd calculate 0/0 and ubsan complained: qvariantanimation.cpp:284:60: runtime error: division by zero Fix by detecting progress - startProgress == 0 and setting localProgress = 0.0 in that case. This is a logical result, even though it might not be what IEEE754 rules would have yielded. A more comprehensive change that aims to reliably keep localProgress ∈ [0,1] and thus avoid the infinities when endProgress == startProgress, is outside the scope of this patch, which deals only with the UBSan error. Pick-to: 6.3 6.2 5.15 Change-Id: I5258b054a2060006795f49fb1cd7604aea3ed46b Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
This commit is contained in:
parent
b330016cf2
commit
52da10f645
@ -278,7 +278,9 @@ void QVariantAnimationPrivate::setCurrentValueForProgress(const qreal progress)
|
||||
|
||||
const qreal startProgress = currentInterval.start.first;
|
||||
const qreal endProgress = currentInterval.end.first;
|
||||
const qreal localProgress = (progress - startProgress) / (endProgress - startProgress);
|
||||
const qreal localProgress =
|
||||
qIsNull(progress - startProgress) ? 0.0 // avoid 0/0 below
|
||||
/* else */ : (progress - startProgress) / (endProgress - startProgress);
|
||||
|
||||
QVariant ret = q->interpolated(currentInterval.start.second,
|
||||
currentInterval.end.second,
|
||||
|
Loading…
Reference in New Issue
Block a user