memcheck.sh 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #!/bin/bash
  2. # Run memcheck.
  3. # This script can be run on the host, or in the docker
  4. chmod +x valgrind
  5. mkdir -p build
  6. cd build
  7. [[ -z "${CACHEB}" ]] && export CACHEB=../cache
  8. [[ ! -e "${CACHEB}" ]] && mkdir -p ${CACHEB}
  9. [[ -z "${uid}" ]] && export uid=`id -u`
  10. [[ -z "${gid}" ]] && export gid=`id -g`
  11. trap "chown -R $uid:$gid ." EXIT
  12. export CTEST_CONFIGURATION_TYPE=RelWithDebInfo
  13. export CTEST_CMAKE_GENERATOR=Ninja
  14. export XTRA_FLAGS="CMAKE_C_COMPILER=/usr/bin/clang-16;CMAKE_CXX_COMPILER=/usr/bin/clang++-16"
  15. export NO_TESTS=1
  16. time ctest -VV -S ../misc/ctest/memcheck.cmake
  17. src/searchd --mockstack | tail -n +6 > stack.txt
  18. source stack.txt
  19. #export MEMORYCHECK_COMMAND_OPTIONS='--tool=memcheck --leak-check=full --track-origins=yes --time-stamp=yes'
  20. export MANTICORE_THREADS_EX='2/1+2/1'
  21. export NO_TESTS=0
  22. rm -f Testing/Temporary/MemoryChecker.*.log
  23. time ctest -V -S ../misc/ctest/memcheck.cmake
  24. find Testing/Temporary/MemoryChecker.*.log -size 0 -delete
  25. # Analysis of memory leak reports
  26. echo "Analyzing memory leak reports..."
  27. LEAK_FOUND=0
  28. LEAK_PATTERNS=("definitely " "invalid " "uninitialised ")
  29. # Function to check for memory leaks in a file
  30. check_leaks() {
  31. local file=$1
  32. local test_num=$(basename "$file" | sed -E 's/MemoryChecker\.([0-9]+)\.log/\1/')
  33. for pattern in "${LEAK_PATTERNS[@]}"; do
  34. if grep -i "$pattern" "$file" > /dev/null; then
  35. echo "ERROR: $pattern DETECTED in test_$test_num"
  36. cat "$file"
  37. LEAK_FOUND=1
  38. fi
  39. done
  40. }
  41. # Process all memory checker log files
  42. for log_file in Testing/Temporary/MemoryChecker.*.log; do
  43. if [ -f "$log_file" ]; then
  44. check_leaks "$log_file"
  45. fi
  46. done
  47. if [ $LEAK_FOUND -eq 1 ]; then
  48. echo "Memory leaks were detected. Check the logs above for details."
  49. exit 1
  50. else
  51. echo "No memory leaks detected."
  52. exit 0
  53. fi