Fix language detection with file names containing more than one dotmaster
| @@ -24,7 +24,9 @@ | |||||
| # Helper function to get the language of a source file. | # Helper function to get the language of a source file. | ||||
| function (sanitizer_lang_of_source FILE RETURN_VAR) | 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(TOLOWER "${FILE_EXT}" FILE_EXT) | ||||
| string(SUBSTRING "${FILE_EXT}" 1 -1 FILE_EXT) | string(SUBSTRING "${FILE_EXT}" 1 -1 FILE_EXT) | ||||
| @@ -31,13 +31,20 @@ function(add_testcase TESTNAME SOURCEFILES) | |||||
| # add a new executable | # add a new executable | ||||
| add_executable(${TESTNAME} ${ARGV}) | add_executable(${TESTNAME} ${ARGV}) | ||||
| add_sanitizers(${TESTNAME}) | |||||
| # add a testcase for executable | # add a testcase for executable | ||||
| add_test(${TESTNAME} ${TESTNAME}) | add_test(${TESTNAME} ${TESTNAME}) | ||||
| endfunction(add_testcase) | 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 | # search for sanitizers | ||||
| @@ -45,8 +52,16 @@ endfunction(add_testcase) | |||||
| find_package(Sanitizers) | find_package(Sanitizers) | ||||
| # | # | ||||
| # add testcases | # add testcases | ||||
| # | # | ||||
| add_testcase("asan_test_cpp" asan_test.cpp) | |||||
| 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 | |||||
| ) | |||||
| @@ -29,7 +29,8 @@ int | |||||
| main(int argc, char **argv) | main(int argc, char **argv) | ||||
| { | { | ||||
| // Allocate a new array and delete it. | // Allocate a new array and delete it. | ||||
| int *array = new int[argc]; | |||||
| int *array = new int[argc + 1]; | |||||
| array[argc] = 0; | |||||
| delete[] array; | delete[] array; | ||||
| /* Access element of the deleted array. This will cause an memory error with | /* Access element of the deleted array. This will cause an memory error with | ||||
| @@ -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]; | |||||
| } | |||||