#!/bin/bash # Run memcheck. # This script can be run on the host, or in the docker chmod +x valgrind mkdir -p build cd build [[ -z "${CACHEB}" ]] && export CACHEB=../cache [[ ! -e "${CACHEB}" ]] && mkdir -p ${CACHEB} [[ -z "${uid}" ]] && export uid=`id -u` [[ -z "${gid}" ]] && export gid=`id -g` trap "chown -R $uid:$gid ." EXIT export CTEST_CONFIGURATION_TYPE=RelWithDebInfo export CTEST_CMAKE_GENERATOR=Ninja export XTRA_FLAGS="CMAKE_C_COMPILER=/usr/bin/clang-16;CMAKE_CXX_COMPILER=/usr/bin/clang++-16" export NO_TESTS=1 time ctest -VV -S ../misc/ctest/memcheck.cmake src/searchd --mockstack | tail -n +6 > stack.txt source stack.txt #export MEMORYCHECK_COMMAND_OPTIONS='--tool=memcheck --leak-check=full --track-origins=yes --time-stamp=yes' export MANTICORE_THREADS_EX='2/1+2/1' export NO_TESTS=0 rm -f Testing/Temporary/MemoryChecker.*.log time ctest -V -S ../misc/ctest/memcheck.cmake find Testing/Temporary/MemoryChecker.*.log -size 0 -delete # Analysis of memory leak reports echo "Analyzing memory leak reports..." LEAK_FOUND=0 LEAK_PATTERNS=("definitely " "invalid " "uninitialised ") # Function to check for memory leaks in a file check_leaks() { local file=$1 local test_num=$(basename "$file" | sed -E 's/MemoryChecker\.([0-9]+)\.log/\1/') for pattern in "${LEAK_PATTERNS[@]}"; do if grep -i "$pattern" "$file" > /dev/null; then echo "ERROR: $pattern DETECTED in test_$test_num" cat "$file" LEAK_FOUND=1 fi done } # Process all memory checker log files for log_file in Testing/Temporary/MemoryChecker.*.log; do if [ -f "$log_file" ]; then check_leaks "$log_file" fi done if [ $LEAK_FOUND -eq 1 ]; then echo "Memory leaks were detected. Check the logs above for details." exit 1 else echo "No memory leaks detected." exit 0 fi