UBSAN: Division by zero in MCT encoder
When running
make clean
make -j CLANG=3
./IVAS_cod -SBA 2 384000 32 scripts/testv/stv2OA32c.wav bit
, UBSAN reports (among others):
lib_enc/ivas_mct_core_enc.c:146:44: runtime error: division by zero
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior lib_enc/ivas_mct_core_enc.c:146:44 in
lib_enc/ivas_mct_core_enc.c:150:26: runtime error: -nan is outside the range of representable values of type 'short'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior lib_enc/ivas_mct_core_enc.c:150:26 in
When running the code in the debugger and putting a breakpoint at ivas_mct_core_enc.c:144
, one can see that sum_ratio
is 0 in frame 870, apparently because of all values in chBitratios
are zero. This then leads to the division by zero in line 146 and in line 150 to the cast of NaN to an int_16t
. For me, the resulting value in line 150 was 0, which maybe be correct or not (and probably can turn out different on different platforms). The division by zero can be avoided by initializing sum_ratio
not to zero, but to a sufficiently small float value. there is another ratio variable sum_tar_ratio
which should be checked as well if it is possible to turn out zero.
/* adjust the ratios further based on received chBitRatios[]*/
ratio_diff = 0;
sum_ratio = 0.0f; // <-- init to zero
sum_tar_ratio = 0.0f;
for ( i = 0; i < nChannels; i++ )
{
sum_ratio += (float) chBitRatios[i]; // <-- all added values here are zero
sum_tar_ratio += (float) force_ch_bit_ratios[i];
}
for ( i = 3; i < nChannels; i++ )
{
cur_ratio = (float) chBitRatios[i] / sum_ratio; // <-- division by zero
tar_ratio = (float) force_ch_bit_ratios[i] / sum_tar_ratio;
tar_ratio = min( tar_ratio, cur_ratio );
chBitRatios[i] = (int16_t) ( tar_ratio * sum_tar_ratio ); // <-- cast of NaN to int16_t
chBitRatios[i] = max( 1, chBitRatios[i] );
assert( chBitRatios[i] < ( BITRATE_MCT_RATIO_RANGE - 1 ) );
ratio_diff += force_ch_bit_ratios[i] - chBitRatios[i];
}
Subpart:McMCT Subpart:Ambisonics Subpart:CoreMDCT Company:Fraunhofer Type:Bug Priority::Critical