테스트 스크립트를 작성 중입니다. 다른 테스트가 있을 때 특정 테스트를 실행하고 싶습니다.확실히반품 실패. 이것은 내가 사용하고 이를 쉘 스크립트 변수에 할당하는 기본 테스트입니다.
cpp -dM -fsanitize=undefined < /dev/null 2>&1 | grep -i -c error
GCC 4.8 또는 Clang 3.2(또는 그 이상)의 경우 정의되지 않은 동작 클리너를 사용할 수 있으며 반환 값은 grep
0입니다. 컴파일러의 경우부족지원되는 경우 값은 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
또는 질문의 요점으로 돌아가서 비교 요점을 무효화하려면, 즉 제공한 C++ 예제와 매우 유사한 cpp의 실패를 확인하려면 다음을 사용하십시오 !
.
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"이 에코됩니다.