Search code examples
linuxbashvalgrind

valgrind : Opening several suppression files at once


I have a script which executes my unit tests using valgrind. Now the script became big, because I have maybe 10 suppression files (one per library), and it is possible that I will have to add more suppressions files.

Now instead of having a line like this :

MEMCHECK_OPTIONS="--tool=memcheck -q -v --num-callers=24 --leak-check=full --show-below-main=no --undef-value-errors=yes --leak-resolution=high --show-reachable=yes --error-limit=no --xml=yes --suppressions=$SUPPRESSION_FILES_DIR/suppression_stdlib.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_cg.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_glut.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_xlib.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_glibc.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_glib.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_qt.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_sdl.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_magick.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_sqlite.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_ld.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_selinux.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_opengl.supp"

I tried doing like this:

MEMCHECK_OPTIONS="--tool=memcheck -q -v --num-callers=24 --leak-check=full --show-below-main=no --undef-value-errors=yes --leak-resolution=high --show-reachable=yes --error-limit=no --xml=yes --suppressions=$SUPPRESSION_FILES_DIR/*.supp"

but valgrind needs a filename (doesn't accept the asterix).

Since I am doing this in a bash script, can someone tell me what is the easiest way to form that line?

I thought about listing all files in the suppression directory, then iterating over that list, and adding --suppressions= prefix.

EDIT

I forgot to ask. This is what I have so far :

ALL_SUPPRESION_FILES=`ls $SUPPRESSION_FILES_DIR/*.supp`

but I can not find how to transfer that into an array. Can someone help?


Solution

  • Just do it this way:

    # form the list of suppression files to pass to the valgrind
    VALGRIND_SUPPRESSION_FILES_LIST=""
    for SUPPRESSION_FILE in $SUPPRESSION_FILES_DIR/*.supp; do
      VALGRIND_SUPPRESSION_FILES_LIST+=" --suppressions=$SUPPRESSION_FILE"
    done
    

    There's no need for ls.

    Here's a way to do it without a loop:

    array=($SUPPRESSION_FILES_DIR/*.supp)
    VALGRIND_SUPPRESSION_FILES_LIST=${array[@]/#/--suppressions=}
    

    Neither of these work properly if filenames contain spaces, but additional steps can take care of that.