From 6f451ad0cf7cb04dbee07a5c8cee5bf651f96a90 Mon Sep 17 00:00:00 2001 From: Andrey Dotsenko <9fcc.dev@gmail.com> Date: Fri, 24 Aug 2018 17:56:13 +0300 Subject: [PATCH 1/2] Force ASAN with tests and make them passed when failed --- tests/CMakeLists.txt | 19 ++++++++++++++++--- tests/asan_test.cpp | 3 ++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6ffb38f..22817be 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -31,22 +31,35 @@ function(add_testcase TESTNAME SOURCEFILES) # add a new executable add_executable(${TESTNAME} ${ARGV}) - add_sanitizers(${TESTNAME}) # add a testcase for executable add_test(${TESTNAME} ${TESTNAME}) endfunction(add_testcase) +# Function to add testcases with asan enabled. +function(add_sanitized_testcase TESTNAME SOURCEFILES) + add_testcase(${TESTNAME} ${SOURCEFILES}) + add_sanitizers(${TESTNAME}) +endfunction(add_sanitized_testcase) + +set(SANITIZE_ADDRESS TRUE) + # # search for sanitizers # find_package(Sanitizers) - # # add testcases # -add_testcase("asan_test_cpp" asan_test.cpp) +add_sanitized_testcase("asan_test_cpp" asan_test.cpp) + +set_tests_properties( + "asan_test_cpp" +PROPERTIES + WILL_FAIL TRUE +) + diff --git a/tests/asan_test.cpp b/tests/asan_test.cpp index 4b276de..6c0a370 100644 --- a/tests/asan_test.cpp +++ b/tests/asan_test.cpp @@ -29,7 +29,8 @@ int main(int argc, char **argv) { // Allocate a new array and delete it. - int *array = new int[argc]; + int *array = new int[argc + 1]; + array[argc] = 0; delete[] array; /* Access element of the deleted array. This will cause an memory error with From 0590614f305cdd1f1f10fbf665c70d01ba4d7bdb Mon Sep 17 00:00:00 2001 From: Andrey Dotsenko <9fcc.dev@gmail.com> Date: Fri, 24 Aug 2018 20:47:43 +0300 Subject: [PATCH 2/2] Fix language detection for files with dot in their names --- cmake/sanitize-helpers.cmake | 4 +++- tests/CMakeLists.txt | 2 ++ tests/shortest.ext.test.cpp | 40 ++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 tests/shortest.ext.test.cpp diff --git a/cmake/sanitize-helpers.cmake b/cmake/sanitize-helpers.cmake index c51ee6a..610f895 100644 --- a/cmake/sanitize-helpers.cmake +++ b/cmake/sanitize-helpers.cmake @@ -24,7 +24,9 @@ # Helper function to get the language of a source file. function (sanitizer_lang_of_source FILE RETURN_VAR) - get_filename_component(FILE_EXT "${FILE}" EXT) + get_filename_component(LONGEST_EXT "${FILE}" EXT) + # Get shortest extension as some files can have dot in their names + string(REGEX REPLACE "^.*(\\.[^.]+)$" "\\1" FILE_EXT ${LONGEST_EXT}) string(TOLOWER "${FILE_EXT}" FILE_EXT) string(SUBSTRING "${FILE_EXT}" 1 -1 FILE_EXT) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 22817be..8553e63 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -56,9 +56,11 @@ find_package(Sanitizers) # add testcases # add_sanitized_testcase("asan_test_cpp" asan_test.cpp) +add_sanitized_testcase("shortest_ext_test_cpp" shortest.ext.test.cpp) set_tests_properties( "asan_test_cpp" + "shortest_ext_test_cpp" PROPERTIES WILL_FAIL TRUE ) diff --git a/tests/shortest.ext.test.cpp b/tests/shortest.ext.test.cpp new file mode 100644 index 0000000..6c0a370 --- /dev/null +++ b/tests/shortest.ext.test.cpp @@ -0,0 +1,40 @@ +/* This file is part of CMake-sanitizers. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * + * Copyright (c) + * 2013-2015 Matt Arsenault + * 2015 RWTH Aachen University, Federal Republic of Germany + */ + + +int +main(int argc, char **argv) +{ + // Allocate a new array and delete it. + int *array = new int[argc + 1]; + array[argc] = 0; + delete[] array; + + /* Access element of the deleted array. This will cause an memory error with + * address sanitizer. + */ + return array[argc]; +}