From 45405eedf9740c6a135ef53754502f1bdb3cf893 Mon Sep 17 00:00:00 2001 From: advasila Date: Wed, 26 Jul 2023 20:47:27 +0300 Subject: [PATCH 1/5] fix issue 635 --- lib_com/options.h | 1 + lib_enc/ivas_qmetadata_enc.c | 41 +++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index c2bc0b866b..a6fbfe775b 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -195,6 +195,7 @@ #define FIX_621_MSVQ_UBSAN_NULL_PTR_OFFSET /* Eri: Issue 621 : UBSAN: applying non-zero offset 7200 to null pointer in lsf_msvq_ma_enc.c */ #define FIX_600_CLEANUP_OF_MANUAL_INSTRUMENTATION /* Eri: Issue 600 : removed manual WMCtool instrumentation outside of WMC_TOOL_SKIP defines */ #define NONBE_FIX_539_MASA_384K_CHIRP /* Nokia: issue 539, puts the normalization of the energy ratios at the correct place, affect MASA 384k only */ +#define FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA /* Nokia: issue 635 adding cast to uint16_t in q_metadata_enc */ /* Fixes for bugs found during split rendering contribution development */ #define TD_TDREND_FIX_NULLPTR_ACCESS /* FhG: avoid nullptr access in ivas_rend_TDObjRendOpen */ diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 7cf68d677d..9350b1c09d 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -2673,15 +2673,30 @@ static int16_t ivas_qmetadata_entropy_encode_dir( } else { +#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA + if ( sign_th < 0 ) + { + avg_elevation_index = ( avg_elevation_alphabet >> 1 ) - avg_elevation_index; + } + else + { + avg_elevation_index += ( avg_elevation_alphabet >> 1 ); + } + avg_elevation *= sign_th; +#else if ( sign_th < 0 ) { avg_elevation_index = -avg_elevation_index; } avg_elevation *= sign_th; avg_elevation_index += ( avg_elevation_alphabet >> 1 ); +#endif } +#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA + avg_azimuth_index = (uint16_t) ( quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet ) ); +#else avg_azimuth_index = quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet ); - +#endif /* Elevation only if not 2D */ if ( q_direction->not_in_2D > 0 ) { @@ -2692,6 +2707,18 @@ static int16_t ivas_qmetadata_entropy_encode_dir( for ( avg_elevation_offset = 0; avg_elevation_offset < q_direction->cfg.search_effort; avg_elevation_offset++ ) { +#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + avg_elevation_index = (uint16_t) ( avg_elevation_index_initial + avg_elevation_offset ); + } + else + { + avg_elevation_index = (uint16_t) ( avg_elevation_index_initial + ivas_qmetadata_dereorder_generic( avg_elevation_offset ) ); + } + + avg_elevation_index = (uint16_t) ( ( avg_elevation_index + avg_elevation_alphabet ) % avg_elevation_alphabet ); +#else if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) { avg_elevation_index = avg_elevation_index_initial + avg_elevation_offset; @@ -2700,7 +2727,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir( { avg_elevation_index = avg_elevation_index_initial + ivas_qmetadata_dereorder_generic( avg_elevation_offset ); } - +#endif avg_elevation_index = ( avg_elevation_index + avg_elevation_alphabet ) % avg_elevation_alphabet; all_zero_dist_elevation_indexes = 1; @@ -2804,7 +2831,11 @@ static int16_t ivas_qmetadata_entropy_encode_dir( if ( ( nbands - start_band >= 5 ) && ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) && ( nblocks > 1 ) ) { use_adapt_avg = calc_var_azi( q_direction, diffuseness_index_max_ec_frame, avg_azimuth - 180, &avg_azimuth ); +#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA + avg_azimuth_index = (uint16_t) ( quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet ) ); +#else avg_azimuth_index = quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet ); +#endif } avg_azimuth_index_initial = avg_azimuth_index; /* avg_azimuth_index;*/ azimuth_bits_ec_best = MAX16B; @@ -2814,9 +2845,13 @@ static int16_t ivas_qmetadata_entropy_encode_dir( for ( avg_azimuth_offset = 0; avg_azimuth_offset < q_direction->cfg.search_effort; avg_azimuth_offset++ ) { set_zero( avg_direction_vector, 3 ); +#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA + avg_azimuth_index = (uint16_t) ( avg_azimuth_index_initial + ivas_qmetadata_dereorder_generic( avg_azimuth_offset ) ); + avg_azimuth_index = (uint16_t) ( ( avg_azimuth_index + avg_azimuth_alphabet ) % avg_azimuth_alphabet ); +#else avg_azimuth_index = avg_azimuth_index_initial + ivas_qmetadata_dereorder_generic( avg_azimuth_offset ); avg_azimuth_index = ( avg_azimuth_index + avg_azimuth_alphabet ) % avg_azimuth_alphabet; - +#endif all_zero_dist_azimuth_indexes = 1; azimuth_bits_ec = ivas_qmetadata_encode_quasi_uniform_length( ivas_qmetadata_reorder_generic( avg_azimuth_index - ( avg_azimuth_alphabet >> 1 ) ), avg_azimuth_alphabet ); -- GitLab From b9e29d838914214d684da29c865fb2e6b90ee83c Mon Sep 17 00:00:00 2001 From: advasila Date: Wed, 26 Jul 2023 21:52:47 +0300 Subject: [PATCH 2/5] fix clang and remove exception from ubsan.supp script --- lib_enc/ivas_qmetadata_enc.c | 2 +- scripts/ubsan.supp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 9350b1c09d..a5960dab6c 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -2833,7 +2833,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir( use_adapt_avg = calc_var_azi( q_direction, diffuseness_index_max_ec_frame, avg_azimuth - 180, &avg_azimuth ); #ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA avg_azimuth_index = (uint16_t) ( quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet ) ); -#else +#else avg_azimuth_index = quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet ); #endif } diff --git a/scripts/ubsan.supp b/scripts/ubsan.supp index 8f312aa15a..485535e281 100644 --- a/scripts/ubsan.supp +++ b/scripts/ubsan.supp @@ -33,7 +33,6 @@ implicit-signed-integer-truncation:cng_dec.c implicit-signed-integer-truncation:cod_tcx.c implicit-signed-integer-truncation:dec_tcx.c implicit-signed-integer-truncation:hdecnrm.c -implicit-signed-integer-truncation:ivas_qmetadata_enc.c implicit-signed-integer-truncation:lib_dec.c implicit-signed-integer-truncation:longarith.c implicit-signed-integer-truncation:pvq_core_dec.c -- GitLab From 7a3216a36e6b55702c81b5ac8d66be3db7b0eab1 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 31 Jul 2023 12:41:54 +0200 Subject: [PATCH 3/5] turn avg_elevation_index_initial, avg_elevation_offset into uint16_t --- lib_enc/ivas_qmetadata_enc.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index a5960dab6c..e9786e146c 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -2551,7 +2551,12 @@ static int16_t ivas_qmetadata_entropy_encode_dir( float avg_direction_vector[3], direction_vector[3], avg_azimuth, avg_elevation; int16_t avg_azimuth_alphabet, avg_elevation_alphabet; uint16_t avg_azimuth_index, avg_elevation_index; +#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA + uint16_t avg_elevation_index_initial, avg_elevation_offset; + int16_t avg_elevation_index_projected; +#else int16_t avg_elevation_index_initial, avg_elevation_offset, avg_elevation_index_projected; +#endif int16_t avg_azimuth_index_initial, avg_azimuth_offset, avg_azimuth_index_projected; int16_t elevation_bits_ec_best, azimuth_bits_ec_best; @@ -2710,11 +2715,11 @@ static int16_t ivas_qmetadata_entropy_encode_dir( #ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) { - avg_elevation_index = (uint16_t) ( avg_elevation_index_initial + avg_elevation_offset ); + avg_elevation_index = avg_elevation_index_initial + avg_elevation_offset; } else { - avg_elevation_index = (uint16_t) ( avg_elevation_index_initial + ivas_qmetadata_dereorder_generic( avg_elevation_offset ) ); + avg_elevation_index = avg_elevation_index_initial + (uint16_t) ivas_qmetadata_dereorder_generic( avg_elevation_offset ); } avg_elevation_index = (uint16_t) ( ( avg_elevation_index + avg_elevation_alphabet ) % avg_elevation_alphabet ); -- GitLab From 1bda08b4f7845baa7fa03356c896da387c5ccb62 Mon Sep 17 00:00:00 2001 From: advasila Date: Mon, 31 Jul 2023 13:54:21 +0300 Subject: [PATCH 4/5] make avg_ele/azi_index_initial and _offset uint16_t --- lib_enc/ivas_qmetadata_enc.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index a5960dab6c..e6ab19b51d 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -2551,9 +2551,15 @@ static int16_t ivas_qmetadata_entropy_encode_dir( float avg_direction_vector[3], direction_vector[3], avg_azimuth, avg_elevation; int16_t avg_azimuth_alphabet, avg_elevation_alphabet; uint16_t avg_azimuth_index, avg_elevation_index; +#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA + int16_t avg_elevation_index_projected; + int16_t avg_azimuth_index_projected; + uint16_t avg_elevation_index_initial, avg_elevation_offset; + uint16_t avg_azimuth_index_initial, avg_azimuth_offset; +#else int16_t avg_elevation_index_initial, avg_elevation_offset, avg_elevation_index_projected; int16_t avg_azimuth_index_initial, avg_azimuth_offset, avg_azimuth_index_projected; - +#endif int16_t elevation_bits_ec_best, azimuth_bits_ec_best; int16_t gr_param_elevation_best = 0, avg_elevation_index_best = 0; @@ -2707,28 +2713,23 @@ static int16_t ivas_qmetadata_entropy_encode_dir( for ( avg_elevation_offset = 0; avg_elevation_offset < q_direction->cfg.search_effort; avg_elevation_offset++ ) { -#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA - if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) - { - avg_elevation_index = (uint16_t) ( avg_elevation_index_initial + avg_elevation_offset ); - } - else - { - avg_elevation_index = (uint16_t) ( avg_elevation_index_initial + ivas_qmetadata_dereorder_generic( avg_elevation_offset ) ); - } - - avg_elevation_index = (uint16_t) ( ( avg_elevation_index + avg_elevation_alphabet ) % avg_elevation_alphabet ); -#else if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) { avg_elevation_index = avg_elevation_index_initial + avg_elevation_offset; } else { +#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA + avg_elevation_index = avg_elevation_index_initial + (uint16_t) ( ivas_qmetadata_dereorder_generic( avg_elevation_offset ) ); +#else avg_elevation_index = avg_elevation_index_initial + ivas_qmetadata_dereorder_generic( avg_elevation_offset ); - } #endif + } +#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA + avg_elevation_index = (uint16_t) (( avg_elevation_index + avg_elevation_alphabet ) % avg_elevation_alphabet); +#else avg_elevation_index = ( avg_elevation_index + avg_elevation_alphabet ) % avg_elevation_alphabet; +#endif all_zero_dist_elevation_indexes = 1; if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) @@ -2846,7 +2847,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir( { set_zero( avg_direction_vector, 3 ); #ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA - avg_azimuth_index = (uint16_t) ( avg_azimuth_index_initial + ivas_qmetadata_dereorder_generic( avg_azimuth_offset ) ); + avg_azimuth_index = avg_azimuth_index_initial + (uint16_t) ( ivas_qmetadata_dereorder_generic( avg_azimuth_offset ) ); avg_azimuth_index = (uint16_t) ( ( avg_azimuth_index + avg_azimuth_alphabet ) % avg_azimuth_alphabet ); #else avg_azimuth_index = avg_azimuth_index_initial + ivas_qmetadata_dereorder_generic( avg_azimuth_offset ); -- GitLab From 4bdb67d90c28506a0088cbd0dd95aebda7d2532f Mon Sep 17 00:00:00 2001 From: advasila Date: Mon, 31 Jul 2023 16:15:43 +0300 Subject: [PATCH 5/5] fix clang and new ubsan --- lib_enc/ivas_qmetadata_enc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 97ff923d92..e8ae02b7c8 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -2719,13 +2719,13 @@ static int16_t ivas_qmetadata_entropy_encode_dir( else { #ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA - avg_elevation_index = avg_elevation_index_initial + (uint16_t) ( ivas_qmetadata_dereorder_generic( avg_elevation_offset ) ); + avg_elevation_index = (uint16_t) ( avg_elevation_index_initial + ivas_qmetadata_dereorder_generic( avg_elevation_offset ) ); #else avg_elevation_index = avg_elevation_index_initial + ivas_qmetadata_dereorder_generic( avg_elevation_offset ); #endif } #ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA - avg_elevation_index = (uint16_t) (( avg_elevation_index + avg_elevation_alphabet ) % avg_elevation_alphabet); + avg_elevation_index = (uint16_t) ( ( avg_elevation_index + avg_elevation_alphabet ) % avg_elevation_alphabet ); #else avg_elevation_index = ( avg_elevation_index + avg_elevation_alphabet ) % avg_elevation_alphabet; #endif @@ -2846,7 +2846,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir( { set_zero( avg_direction_vector, 3 ); #ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA - avg_azimuth_index = avg_azimuth_index_initial + (uint16_t) ( ivas_qmetadata_dereorder_generic( avg_azimuth_offset ) ); + avg_azimuth_index = (uint16_t) ( avg_azimuth_index_initial + ivas_qmetadata_dereorder_generic( avg_azimuth_offset ) ); avg_azimuth_index = (uint16_t) ( ( avg_azimuth_index + avg_azimuth_alphabet ) % avg_azimuth_alphabet ); #else avg_azimuth_index = avg_azimuth_index_initial + ivas_qmetadata_dereorder_generic( avg_azimuth_offset ); -- GitLab