diff --git a/CMakeLists.txt b/CMakeLists.txt index 97fa3b861e..bef6278246 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -189,6 +189,18 @@ if (SANITIZE_UNDEFINED) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all") endif () +add_boolean_option(SANITIZE_MEMORY False "enable the memory sanitizer (MSan, requires clang, incompatible with ASan/UBSan)" ON) +if(SANITIZE_MEMORY) + if (SANITIZE_UNDEFINED OR SANITIZE_ADDRESS) + message(FATAL_ERROR "memory sanitizer cannot coexist with address sanitizer or undefined behavior sanitizer, please disable either MSan or ASan and UBSan") + endif() + if (NOT CMAKE_C_COMPILER_ID STREQUAL "Clang" OR NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) + message(FATAL_ERROR "memory sanitizer requires clang, please set clang using CC=/usr/bin/clang CXX=/usr/bin/clang++ ./build_oai ...") + endif() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -fsanitize-recover=memory") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -fsanitize-recover=memory") +endif() + add_definitions("-DASN_DISABLE_OER_SUPPORT -DHAVE_CONFIG_H -DHAVE_CONFIG_H_") ######################### diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 40588b46b5..cb66d4f862 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -155,6 +155,10 @@ Options: Enable the address sanitizer on all targets --sanitize-undefined | -fsanitize=undefined Enable the undefined behavior sanitizer on all targets +--sanitize-memory | -fsanitize=memory + Enable the memory sanitizer on all targets. Requires clang, and is + incompatible with ASan/UBSan. To build, issue: + CC=/usr/bin/clang CXX=/usr/bin/clang++ ./build_oai ... --sanitize-memory -h | --help Print this help" } @@ -407,6 +411,11 @@ function main() { --sanitize-undefined | -fundefined=address) CMAKE_CMD="$CMAKE_CMD -DSANITIZE_UNDEFINED=True" shift;; + --sanitize-memory | -fsanitize=memory) + echo_warning "Note: memory sanitizer\n* requires clang (tested: v17)\n* is incompatible with address/undefined behavior sanitizer\n* requires cmake_targets/tools/memsan.patch" + sleep 2 + CMAKE_CMD="$CMAKE_CMD -DSANITIZE_MEMORY=ON -DSANITIZE_ADDRESS=OFF -DSANITIZE_UNDEFINED=OFF" + shift;; -h | --help) print_help exit 1;; diff --git a/cmake_targets/tools/memsan.patch b/cmake_targets/tools/memsan.patch new file mode 100644 index 0000000000..a8b8e9f992 --- /dev/null +++ b/cmake_targets/tools/memsan.patch @@ -0,0 +1,53 @@ +commit bf7f0c4f0f1bfce586667b50050640b67a7a747a +Author: Robert Schmidt +Date: Wed Jun 7 18:24:50 2023 +0200 + + Fix dlopen() linker errors in dfts, ldpc, ldpc_parityCheck, and params_libconfig + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index c29105d503..3b9e7d1246 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -508,7 +508,7 @@ add_library(CONFIG_LIB + ) + target_link_libraries(CONFIG_LIB PRIVATE dl UTIL) + add_library(params_libconfig MODULE ${CONFIG_ROOTDIR}/libconfig/config_libconfig.c) +-target_link_libraries(params_libconfig config) ++target_link_libraries(params_libconfig config CONFIG_LIB minimal_lib) + # shared library loader + set (SHLIB_LOADER_SOURCES + ${OPENAIR_DIR}/common/utils/load_module_shlib.c +@@ -1018,16 +1018,19 @@ if (ENABLE_LDPC_CUDA) + endif() + endif() + +-add_library(ldpc MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} ) ++add_library(ldpc MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} ${OPENAIR1_DIR}/PHY/CODING/crc_byte.c) + target_link_libraries(ldpc PRIVATE ldpc_gen_HEADERS) ++target_link_libraries(ldpc PRIVATE UTIL) + + add_library(ldpc_parityCheck MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} ) + target_compile_definitions(ldpc_parityCheck PUBLIC NR_LDPC_ENABLE_PARITY_CHECK) + target_link_libraries(ldpc_parityCheck PRIVATE ldpc_gen_HEADERS) ++target_link_libraries(ldpc_parityCheck PRIVATE UTIL minimal_lib) + + add_library(coding MODULE ${PHY_TURBOSRC} ) + + add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c ) ++target_link_libraries(dfts PRIVATE minimal_lib) + + + set(PHY_SRC_COMMON +diff --git a/common/utils/minimal_stub.c b/common/utils/minimal_stub.c +index be9c1b399d..7ad0df4d56 100644 +--- a/common/utils/minimal_stub.c ++++ b/common/utils/minimal_stub.c +@@ -1,6 +1,8 @@ ++#include + #ifndef T_TRACER + int T_stdout; + #endif ++int oai_exit = 0; + + void exit_function(const char *file, const char *function, const int line, const char *s, const int assert) + { diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c index 71142c120c..458b4a9ee5 100644 --- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c +++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c @@ -253,7 +253,9 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB, uint8_t index=0; int nb_re_pucch = 12*pucch_pdu->prb_size; // prb size is 1 - int32_t rp[frame_parms->nb_antennas_rx][pucch_pdu->nr_of_symbols][nb_re_pucch],*tmp_rp; + int32_t rp[frame_parms->nb_antennas_rx][pucch_pdu->nr_of_symbols][nb_re_pucch]; + memset(rp, 0, sizeof(rp)); + int32_t *tmp_rp = NULL; for (int l=0; lnr_of_symbols; l++) { uint8_t l2 = l + pucch_pdu->start_symbol_index; @@ -1169,7 +1171,9 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB, int nb_re_pucch = 12*pucch_pdu->prb_size; - int16_t rp[Prx2][2][nb_re_pucch*2],*tmp_rp; + int16_t rp[Prx2][2][nb_re_pucch*2]; + memset(rp, 0, sizeof(rp)); + int16_t *tmp_rp = NULL; __m64 dmrs_re,dmrs_im; for (int aa=0;aaframe_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS)); //phy_init_nr_top(frame_parms); diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c index 3ced917cac..d600c480d2 100644 --- a/openair1/SIMULATION/NR_PHY/pucchsim.c +++ b/openair1/SIMULATION/NR_PHY/pucchsim.c @@ -123,7 +123,7 @@ int main(int argc, char **argv) int16_t amp=0x7FFF; int nr_slot_tx=0; int nr_frame_tx=0; - uint64_t actual_payload=0,payload_received; + uint64_t actual_payload = 0, payload_received = 0; bool random_payload = true; int nr_bit=1; // maximum value possible is 2 uint8_t m0=0;// higher layer paramater initial cyclic shift diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c index cdb2bd1cc2..2114bbe766 100644 --- a/openair1/SIMULATION/NR_PHY/ulschsim.c +++ b/openair1/SIMULATION/NR_PHY/ulschsim.c @@ -427,7 +427,7 @@ int main(int argc, char **argv) phy_init_nr_gNB(gNB); //configure UE - UE = malloc(sizeof(PHY_VARS_NR_UE)); + UE = calloc(1, sizeof(*UE)); memcpy(&UE->frame_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS)); UE->frame_parms.nb_antennas_tx = n_tx; diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c index 9ba14d4f8e..fad949ce93 100644 --- a/openair1/SIMULATION/TOOLS/random_channel.c +++ b/openair1/SIMULATION/TOOLS/random_channel.c @@ -110,7 +110,7 @@ void fill_channel_desc(channel_desc_t *chan_desc, LOG_D(OCM,"[CHANNEL] Doing delays ...\n"); if (delays==NULL) { - chan_desc->delays = (double *) malloc(nb_taps*sizeof(double)); + chan_desc->delays = calloc(nb_taps, sizeof(double)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_DELAY ; delta_tau = Td/nb_taps; @@ -131,22 +131,22 @@ void fill_channel_desc(channel_desc_t *chan_desc, chan_desc->first_run = 1; chan_desc->ip = 0.0; chan_desc->max_Doppler = max_Doppler; - chan_desc->ch = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *)); - chan_desc->chF = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *)); - chan_desc->a = (struct complexd **) malloc(nb_taps*sizeof(struct complexd *)); + chan_desc->ch = calloc(nb_tx*nb_rx, sizeof(struct complexd *)); + chan_desc->chF = calloc(nb_tx*nb_rx, sizeof(struct complexd *)); + chan_desc->a = calloc(nb_taps, sizeof(struct complexd *)); LOG_D(OCM,"[CHANNEL] Filling ch \n"); for (i = 0; ich[i] = (struct complexd *) malloc(channel_length * sizeof(struct complexd)); + chan_desc->ch[i] = calloc(channel_length, sizeof(struct complexd)); for (i = 0; ichF[i] = (struct complexd *) malloc(275 * 12 * sizeof(struct complexd)); // allocate for up to 275 RBs, 12 symbols per RB + chan_desc->chF[i] = calloc(275 * 12, sizeof(struct complexd)); // allocate for up to 275 RBs, 12 symbols per RB LOG_D(OCM,"[CHANNEL] Filling a (nb_taps %d)\n",nb_taps); for (i = 0; ia[i],nb_tx*nb_rx * sizeof(struct complexd)); - chan_desc->a[i] = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd)); + chan_desc->a[i] = calloc(nb_tx*nb_rx, sizeof(struct complexd)); } LOG_D(OCM,"[CHANNEL] Doing R_sqrt ...\n"); @@ -367,7 +367,7 @@ void tdlModel(int tdl_paths, double *tdl_delays, double *tdl_amps_dB, double DS 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td)); printf("TDL : %f Ms/s, nb_taps %d, Td %e, channel_length %d\n",chan_desc->sampling_rate,tdl_paths,chan_desc->Td,chan_desc->channel_length); double sum_amps = 0; - chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double)); + chan_desc->amps = calloc(chan_desc->nb_taps, sizeof(double)); for (int i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*tdl_amps_dB[i]); @@ -382,19 +382,19 @@ void tdlModel(int tdl_paths, double *tdl_delays, double *tdl_amps_dB, double DS chan_desc->delays = tdl_delays; chan_desc->aoa = 0; chan_desc->random_aoa = 0; - chan_desc->ch = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *)); - chan_desc->chF = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *)); - chan_desc->a = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *)); + chan_desc->ch = calloc(nb_tx*nb_rx, sizeof(struct complexd *)); + chan_desc->chF = calloc(nb_tx*nb_rx, sizeof(struct complexd *)); + chan_desc->a = calloc(chan_desc->nb_taps, sizeof(struct complexd *)); chan_desc->ricean_factor = 1.0; for (int i = 0; ich[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd)); + chan_desc->ch[i] = calloc(chan_desc->channel_length, sizeof(struct complexd)); for (int i = 0; ichF[i] = (struct complexd *) malloc((2+(275*12)) * sizeof(struct complexd)); + chan_desc->chF[i] = calloc(2+(275*12), sizeof(struct complexd)); for (int i = 0; inb_taps; i++) - chan_desc->a[i] = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd)); + chan_desc->a[i] = calloc(nb_tx*nb_rx, sizeof(struct complexd)); int matrix_size = nb_tx*nb_rx; double *correlation_matrix[matrix_size]; @@ -446,9 +446,9 @@ void tdlModel(int tdl_paths, double *tdl_delays, double *tdl_amps_dB, double DS } } - chan_desc->R_sqrt = (struct complexd **) malloc(matrix_size*sizeof(struct complexd **)); + chan_desc->R_sqrt = calloc(matrix_size, sizeof(*chan_desc->R_sqrt)); for (int row = 0; row < matrix_size; row++) { - chan_desc->R_sqrt[row] = (struct complexd *) calloc(1, matrix_size*sizeof(struct complexd)); + chan_desc->R_sqrt[row] = calloc(matrix_size, sizeof(**chan_desc->R_sqrt)); if (correlation_matrix[row] == NULL) { // TS 38.104 - Table G.2.3.1.2-4: MIMO correlation matrices for low correlation chan_desc->R_sqrt[row][row].r = 1.0; @@ -637,7 +637,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, chan_desc->Td = 4.625; chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td)); sum_amps = 0; - chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double)); + chan_desc->amps = calloc(chan_desc->nb_taps, sizeof(double)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ; for (i = 0; inb_taps; i++) { @@ -657,15 +657,15 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, chan_desc->a = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *)); for (i = 0; ich[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd)); + chan_desc->ch[i] = calloc(chan_desc->channel_length, sizeof(struct complexd)); for (i = 0; ichF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd)); + chan_desc->chF[i] = calloc(1200, sizeof(struct complexd)); for (i = 0; inb_taps; i++) - chan_desc->a[i] = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd)); + chan_desc->a[i] = calloc(nb_tx*nb_rx, sizeof(struct complexd)); - chan_desc->R_sqrt = (struct complexd **) malloc(6*sizeof(struct complexd **)); + chan_desc->R_sqrt = calloc(6, sizeof(struct complexd **)); if (nb_tx==2 && nb_rx==2) { for (i = 0; i<6; i++) @@ -680,7 +680,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ; for (i = 0; i<6; i++) { - chan_desc->R_sqrt[i] = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd)); + chan_desc->R_sqrt[i] = calloc(nb_tx*nb_rx*nb_tx*nb_rx, sizeof(struct complexd)); for (j = 0; jR_sqrt[i][j].r = 1.0;