Source: ecasound
Version: 2.9.1-7
Severity: important
Justification: fails to build from source but built in the past
User: [email protected]
Usertags: ftbfs
Ecasound FTBFS on Alpha due to a test-suite failure [1]:
make check-TESTS
make[5]: Entering directory '/«PKGBUILDDIR»/libecasound'
make[6]: Entering directory '/«PKGBUILDDIR»/libecasound'
../test-driver: line 107: 22820 Floating point exception"$@" > $log_file 2>&1
FAIL: libecasound_tester
Running the test suite under gdb reveals the place of the floating
point exception to be:
#0 0x0000000120114d30 in GENERIC_OSCILLATOR::set_parameter (this=0x12022ec10,
param=<optimized out>, value=0) at osc-gen.cpp:208
which is on the line of code:
loop_length_rep = 1.0f / frequency();
i.e., a division by frequency() after setting frequency to zero, thus
a division by zero. But ecasound is compiled with -ffast-math, which
according to the gcc manual in turn sets -ffinite-math-only which is
a guarantee to the compiler that all floating point calculations are
finite. On Alpha abusing that guarantee results in a floating point
exception and program termination.
Assuming it is intended that frequencies can be zero I attach a patch
that protects against the division by zero. With that ecasound builds
to completion on Alpha.
(In the patch I also assume that frequencies are non-negative thus
there is no possibility of -0.0 as a frequency.)
Cheers
Michael.
[1]
https://buildd.debian.org/status/fetch.php?pkg=ecasound&arch=alpha&ver=2.9.1-7&stamp=1440432975
Index: ecasound-2.9.1/libecasound/osc-gen.cpp
===================================================================
--- ecasound-2.9.1.orig/libecasound/osc-gen.cpp
+++ ecasound-2.9.1/libecasound/osc-gen.cpp
@@ -205,7 +205,10 @@ void GENERIC_OSCILLATOR::set_parameter(i
switch (param) {
case 1:
frequency(value);
- loop_length_rep = 1.0f / frequency(); // length of one wave in seconds
+ if (frequency() == 0.0)
+ loop_length_rep = INFINITY; // Protect against div by zero
+ else
+ loop_length_rep = 1.0f / frequency(); // length of one wave in seconds
break;
case 2: