テストスクリプトを作成しています。他のテストがあるときに特定のテストを実行したいと思います。確かに返品失敗。これは私が使用し、それをシェルスクリプト変数に割り当てる基本的なテストです。
cpp -dM -fsanitize=undefined < /dev/null 2>&1 | grep -i -c error
GCC 4.8またはClang 3.2(またはそれ以上)の場合、未定義の動作クリーナーを使用でき、戻り値はgrep
0です。コンパイラの場合部族サポートされている場合、値はゼロではありません。たとえば、
# Clang 3.1
$ cpp -dM -fsanitize=undefined < /dev/null
clang: error: unsupported argument 'undefined' to option 'fsanitize='
もしgrep -v -c
私は次の行を試しました。矛盾プリプロセッサによってダンプされた行数を効果的に計算する「エラー」を計算します。したがって、私が得た結果は248(エラーなし)と1(エラーあり)ですが、失敗すると0の値が得られません。
後で読みやすさ、私は次を実行します:
if [ "$HAVE_UBSAN" -ne "0" ]; then
export CXXFLAGS="-DNDEBUG -g2 -O2 -fsanitize=undefined $MY_CXXFLAGS"
make ...
# Run self tests, scrape output for failures
fi
問題は、読みやすくするためにテストから返された数を無効にする必要があることですgrep -c error
。つまり、結果を0(なし)または0以外(何か)に置き換える必要があります。
C / C ++では、次のことを行います(注!
表現に関して):
!(`cpp -dM -fsanitize=undefined < /dev/null 2>&1 | grep -i -c error`)
で返された数をどのように戻しますかgrep
?
私いいえValgrindテストではcountを直接使用できるため、この問題があります。
HAVE_VALGRIND=`which valgrind | grep -i -c valgrind`
答え1
そのような場合は、cppの戻り値を直接確認できます。
HAVE_UBSAN=$(cpp -dM -fsanitize=undefined < /dev/null > /dev/null 2>&1 && echo 1)
if [ "$HAVE_UBSAN" = 1 ]
. . .
でも
if cpp -dM -fsanitize=undefined < /dev/null > /dev/null 2>&1
then
export CXXFLAGS="-DNDEBUG -g2 -O2 -fsanitize=undefined $MY_CXXFLAGS"
make ...
# Run self tests, scrape output for failures
fi
あるいは、質問の要点に戻って比較の要点を無効にするには、次のようにします!
。
if ! cpp -dM -fsanitize=undefined < /dev/null > /dev/null 2>&1
then
echo 'NO sanitizer'
fi
同様の手法を使用してVALGRINDを設定できます。
VALGRIND=$(which valgrind > /dev/null && echo 1)
C++を知って&&
いるので||
。これはシェルコマンドラインでも同様に機能します。上記でwhich valgrind > /dev/null
成功すると、「1」がエコーされます。