set ( DEBUGGING_C_FLAGS "${DEBUGGING_C_FLAGS} -pg" )
endif ( ENABLE_PROFILE AND CMAKE_COMPILER_IS_GNUCXX )
+# ASAN and TSAN are mutually exclusive, so have them absolutely set SANITIZER_*_FLAGS first.
if ( ENABLE_ADDRESS_SANITIZER )
- set ( SANITIZER_CXX_FLAGS "-fsanitize=address -fno-omit-frame-pointer" )
-
- set ( CMAKE_REQUIRED_FLAGS "${SANITIZER_LINKER_FLAGS} -fsanitize=address" )
- check_cxx_compiler_flag ( "${SANITIZER_CXX_FLAGS}" HAS_SANITIZE_ADDRESS_LDFLAG )
- if ( HAS_SANITIZE_ADDRESS_LDFLAG )
- set ( SANITIZER_LINKER_FLAGS "${SANITIZER_LINKER_FLAGS} -fsanitize=address" )
- endif ()
+ set ( ASAN_CXX_FLAGS "-fsanitize=address -fno-omit-frame-pointer" )
+ set ( ASAN_LINKER_FLAGS "-fsanitize=address" )
+ set ( CMAKE_REQUIRED_FLAGS "${ASAN_LINKER_FLAGS}" )
+ check_cxx_compiler_flag ( "${ASAN_CXX_FLAGS}" HAVE_ADDRESS_SANITIZER )
unset ( CMAKE_REQUIRED_FLAGS )
+ if ( HAVE_ADDRESS_SANITIZER )
+ set ( SANITIZER_CXX_FLAGS "${ASAN_CXX_FLAGS}" )
+ set ( SANITIZER_LINKER_FLAGS "${ASAN_LINKER_FLAGS}" )
+ else ()
+ message ( SEND_ERROR "Could not enable the address sanitizer!" )
+ endif ()
endif ( ENABLE_ADDRESS_SANITIZER )
if ( ENABLE_THREAD_SANITIZER )
- set ( SANITIZER_CXX_FLAGS "-fsanitize=thread -fno-omit-frame-pointer" )
-
- set ( CMAKE_REQUIRED_FLAGS "${SANITIZER_LINKER_FLAGS} -fsanitize=thread" )
- check_cxx_compiler_flag ( "${SANITIZER_CXX_FLAGS}" HAS_SANITIZE_THREAD_LDFLAG )
- if ( HAS_SANITIZE_THREAD_LDFLAG )
- set ( SANITIZER_LINKER_FLAGS "${SANITIZER_LINKER_FLAGS} -fsanitize=thread" )
- endif ()
+ set ( TSAN_CXX_FLAGS "-fsanitize=thread -fno-omit-frame-pointer" )
+ set ( TSAN_LINKER_FLAGS "-fsanitize=thread" )
+ set ( CMAKE_REQUIRED_FLAGS "${TSAN_LINKER_FLAGS}" )
+ check_cxx_compiler_flag ( "${TSAN_CXX_FLAGS}" HAVE_THREAD_SANITIZER )
unset ( CMAKE_REQUIRED_FLAGS )
+ if ( HAVE_THREAD_SANITIZER )
+ set ( SANITIZER_CXX_FLAGS "${TSAN_CXX_FLAGS}" )
+ set ( SANITIZER_LINKER_FLAGS "${TSAN_LINKER_FLAGS}" )
+ else ()
+ message ( SEND_ERROR "Could not enable the thread sanitizer!" )
+ endif ()
endif ( ENABLE_THREAD_SANITIZER )
+if ( ENABLE_UB_SANITIZER )
+ set ( UBSAN_CXX_FLAGS "-fsanitize=undefined -fno-sanitize=alignment -fno-omit-frame-pointer" )
+ set ( UBSAN_LINKER_FLAGS "-fsanitize=undefined -fno-sanitize=alignment" )
+ set ( CMAKE_REQUIRED_FLAGS "${UBSAN_LINKER_FLAGS}" )
+ check_cxx_compiler_flag ( "${UBSAN_CXX_FLAGS}" HAVE_UB_SANITIZER )
+ unset ( CMAKE_REQUIRED_FLAGS )
+ if ( HAVE_UB_SANITIZER )
+ set ( SANITIZER_CXX_FLAGS "${SANITIZER_CXX_FLAGS} ${UBSAN_CXX_FLAGS}" )
+ set ( SANITIZER_LINKER_FLAGS "${SANITIZER_LINKER_FLAGS} ${UBSAN_LINKER_FLAGS}" )
+ else ()
+ message ( SEND_ERROR "Could not enable the undefined behavior sanitizer!" )
+ endif ()
+endif ( ENABLE_UB_SANITIZER )
+
if ( ENABLE_CODE_COVERAGE )
include(${CMAKE_MODULE_PATH}/CodeCoverage.cmake)
endif ( ENABLE_CODE_COVERAGE )
option ( ENABLE_PROFILE "Enable profiling options (developers only)" OFF )
option ( ENABLE_ADDRESS_SANITIZER "enable address sanitizer support" OFF )
option ( ENABLE_THREAD_SANITIZER "enable thread sanitizer support" OFF )
+option ( ENABLE_UB_SANITIZER "enable undefined behavior sanitizer support" OFF )
option ( ENABLE_CODE_COVERAGE "Whether to enable code coverage support" OFF )
# signals
#!/bin/sh
# Convenience wrapper for easily viewing/setting options that
# the project's CMake scripts will recognize
+
set -e
command="$0 $*"
enable address sanitizer support
--enable-thread-sanitizer
enable thread sanitizer support
+ --enable-ub-sanitizer
+ enable undefined behavior sanitizer support
--enable-unit-tests build unit tests
--enable-piglet build piglet test harness
--disable-static-daq link static DAQ modules
CMakeCacheEntries="$CMakeCacheEntries -D $1:$2=$3"
}
-check_and_append_cache_entry() {
- if [ -f $3 ]; then
- append_cache_entry $1 $2 $3
- else
- echo ""
- echo "the $1 variable, which is specified using a --with-* options,"
- echo "requires an absolute path to the library. Could not stat the"
- echo "the library:"
- echo " $3"
- echo ""
- exit 1
- fi
-}
-
# set defaults
builddir=build
prefix=/usr/local/snort
--disable-thread-sanitizer)
append_cache_entry ENABLE_THREAD_SANITIZER BOOL false
;;
+ --enable-ub-sanitizer)
+ append_cache_entry ENABLE_UB_SANITIZER BOOL true
+ ;;
+ --disable-ub-sanitizer)
+ append_cache_entry ENABLE_UB_SANITIZER BOOL false
+ ;;
--enable-unit-tests)
append_cache_entry ENABLE_UNIT_TESTS BOOL true
;;
set (EXTRA_VERSION_MAJOR 1)
set (EXTRA_VERSION_MINOR 0)
set (EXTRA_VERSION_PATCH 0)
+set (EXTRA_VERSION "${EXTRA_VERSION_MAJOR}.${EXTRA_VERSION_MINOR}.${EXTRA_VERSION_PATCH}")
set (CMAKE_CXX_STANDARD 11)
set (CMAKE_CXX_STANDARD_REQUIRED ON)
set (CMAKE_C_STANDARD_REQUIRED ON)
set (CMAKE_C_EXTENSIONS ON)
+set (CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
# Pull in definitions of various install directories
include (GNUInstallDirs)
+include (${CMAKE_MODULE_PATH}/create_options.cmake)
+include (${CMAKE_MODULE_PATH}/configure_options.cmake)
set (CPACK_GENERATOR TGZ)
set (CPACK_PACKAGE_NAME "snort_extra")
set ( ${OPT}_CPPFLAGS "${CPPFLAGS}" CACHE STRING "" )
endforeach ( OPT )
+# Set these after all tests are done but *before* any subdirectories are included
+# or other targets declared.
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS}")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS}")
+set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EXTRA_LINKER_FLAGS}")
+set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${EXTRA_LINKER_FLAGS}")
+foreach (EXTRA_LIBRARY IN LISTS EXTRA_LIBRARIES)
+ link_libraries(${EXTRA_LIBRARY})
+endforeach (EXTRA_LIBRARY)
+
add_subdirectory ( src )
+
+message("
+-------------------------------------------------------
+${CMAKE_PROJECT_NAME} version ${EXTRA_VERSION}
+
+Install options:
+ prefix: ${CMAKE_INSTALL_PREFIX}
+
+Compiler options:
+ CC: ${CMAKE_C_COMPILER}
+ CXX: ${CMAKE_CXX_COMPILER}
+ CFLAGS: ${CMAKE_C_FLAGS}
+ CXXFLAGS: ${CMAKE_CXX_FLAGS}
+ EXE_LDFLAGS: ${CMAKE_EXE_LINKER_FLAGS}
+ MODULE_LDFLAGS: ${CMAKE_MODULE_LINKER_FLAGS}
+")
--- /dev/null
+#
+# Loosely based on:
+# https://raw.githubusercontent.com/peti/autoconf-archive/master/m4/ax_code_coverage.m4
+# - and -
+# https://raw.githubusercontent.com/bilke/cmake-modules/master/CodeCoverage.cmake
+#
+
+find_program( GCOV_PATH gcov )
+
+if(NOT GCOV_PATH)
+ message(FATAL_ERROR "gcov not found! Aborting...")
+endif()
+
+if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
+ if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3)
+ message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...")
+ endif()
+elseif(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+ message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
+endif()
+
+set(COVERAGE_COMPILER_FLAGS "-O0 -g -fprofile-arcs -ftest-coverage")
+
+if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
+ set(COVERAGE_LINKER_FLAGS "")
+ set(COVERAGE_LIBRARIES "gcov")
+else()
+ set(COVERAGE_LINKER_FLAGS "--coverage")
+ set(COVERAGE_LIBRARIES "")
+endif()
+
+mark_as_advanced(
+ COVERAGE_COMPILER_FLAGS
+ COVERAGE_LINKER_FLAGS
+ COVERAGE_LIBRARIES
+)
--- /dev/null
+# map cmake options to compiler defines and do miscellaneous further configuration work
+# cmake options are defined in cmake/create_options.cmake
+
+include(CheckCXXCompilerFlag)
+
+# debugging
+
+if ( ENABLE_DEBUG )
+ set ( DEBUGGING_C_FLAGS "${DEBUGGING_C_FLAGS} -g -DDEBUG" )
+endif ( ENABLE_DEBUG )
+
+if ( ENABLE_GDB )
+ set ( DEBUGGING_C_FLAGS "${DEBUGGING_C_FLAGS} -g -ggdb" )
+endif ( ENABLE_GDB )
+
+# ASAN and TSAN are mutually exclusive, so have them absolutely set SANITIZER_*_FLAGS first.
+if ( ENABLE_ADDRESS_SANITIZER )
+ set ( ASAN_CXX_FLAGS "-fsanitize=address -fno-omit-frame-pointer" )
+ set ( ASAN_LINKER_FLAGS "-fsanitize=address" )
+ set ( CMAKE_REQUIRED_FLAGS "${ASAN_LINKER_FLAGS}" )
+ check_cxx_compiler_flag ( "${ASAN_CXX_FLAGS}" HAVE_ADDRESS_SANITIZER )
+ unset ( CMAKE_REQUIRED_FLAGS )
+ if ( HAVE_ADDRESS_SANITIZER )
+ set ( SANITIZER_CXX_FLAGS "${ASAN_CXX_FLAGS}" )
+ set ( SANITIZER_LINKER_FLAGS "${ASAN_LINKER_FLAGS}" )
+ else ()
+ message ( SEND_ERROR "Could not enable the address sanitizer!" )
+ endif ()
+endif ( ENABLE_ADDRESS_SANITIZER )
+
+if ( ENABLE_THREAD_SANITIZER )
+ set ( TSAN_CXX_FLAGS "-fsanitize=thread -fno-omit-frame-pointer" )
+ set ( TSAN_LINKER_FLAGS "-fsanitize=thread" )
+ set ( CMAKE_REQUIRED_FLAGS "${TSAN_LINKER_FLAGS}" )
+ check_cxx_compiler_flag ( "${TSAN_CXX_FLAGS}" HAVE_THREAD_SANITIZER )
+ unset ( CMAKE_REQUIRED_FLAGS )
+ if ( HAVE_THREAD_SANITIZER )
+ set ( SANITIZER_CXX_FLAGS "${TSAN_CXX_FLAGS}" )
+ set ( SANITIZER_LINKER_FLAGS "${TSAN_LINKER_FLAGS}" )
+ else ()
+ message ( SEND_ERROR "Could not enable the thread sanitizer!" )
+ endif ()
+endif ( ENABLE_THREAD_SANITIZER )
+
+if ( ENABLE_UB_SANITIZER )
+ set ( UBSAN_CXX_FLAGS "-fsanitize=undefined -fno-sanitize=alignment -fno-omit-frame-pointer" )
+ set ( UBSAN_LINKER_FLAGS "-fsanitize=undefined -fno-sanitize=alignment" )
+ set ( CMAKE_REQUIRED_FLAGS "${UBSAN_LINKER_FLAGS}" )
+ check_cxx_compiler_flag ( "${UBSAN_CXX_FLAGS}" HAVE_UB_SANITIZER )
+ unset ( CMAKE_REQUIRED_FLAGS )
+ if ( HAVE_UB_SANITIZER )
+ set ( SANITIZER_CXX_FLAGS "${SANITIZER_CXX_FLAGS} ${UBSAN_CXX_FLAGS}" )
+ set ( SANITIZER_LINKER_FLAGS "${SANITIZER_LINKER_FLAGS} ${UBSAN_LINKER_FLAGS}" )
+ else ()
+ message ( SEND_ERROR "Could not enable the undefined behavior sanitizer!" )
+ endif ()
+endif ( ENABLE_UB_SANITIZER )
+
+if ( ENABLE_CODE_COVERAGE )
+ include(${CMAKE_MODULE_PATH}/CodeCoverage.cmake)
+endif ( ENABLE_CODE_COVERAGE )
+
+
+# Accumulate extra flags and libraries
+#[[
+message("
+ DEBUGGING_C_FLAGS = ${DEBUGGING_C_FLAGS}
+ SANITIZER_CXX_FLAGS = ${SANITIZER_CXX_FLAGS}
+ SANITIZER_LINKER_FLAGS = ${SANITIZER_LINKER_FLAGS}
+ COVERAGE_COMPILER_FLAGS = ${COVERAGE_COMPILER_FLAGS}
+ COVERAGE_LINKER_FLAGS = ${COVERAGE_LINKER_FLAGS}
+ COVERAGE_LIBRARIES = ${COVERAGE_LIBRARIES}
+")
+]]
+set ( EXTRA_C_FLAGS "${EXTRA_C_FLAGS} ${HARDENED_CXX_FLAGS} ${DEBUGGING_C_FLAGS} ${SANITIZER_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" )
+set ( EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} ${HARDENED_CXX_FLAGS} ${DEBUGGING_C_FLAGS} ${SANITIZER_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" )
+set ( EXTRA_LINKER_FLAGS "${EXTRA_LINKER_FLAGS} ${HARDENED_LINKER_FLAGS} ${SANITIZER_LINKER_FLAGS} ${COVERAGE_LINKER_FLAGS}" )
+foreach (EXTRA_LIBRARY IN LISTS COVERAGE_LIBRARIES)
+ list ( APPEND EXTRA_LIBRARIES ${EXTRA_LIBRARY} )
+endforeach ()
--- /dev/null
+# All of the possible user options. All of these options will show up
+# in the CACHE. If you'd like to change one of these values,
+# use `ccmake ${PATH_TO_SOURCE}`.
+# Alternatively, you can pass them to cmake on the command line using
+# the '-D' flag:
+# cmake -DENABLE_FOO=ON -DCMAKE_INSTALL_PREFIX=/my/install/path $cmake_src_path
+
+# debugging
+option ( ENABLE_DEBUG "Enable debugging options (bugreports and developers only)" OFF )
+option ( ENABLE_GDB "Enable gdb debugging information" ON )
+option ( ENABLE_ADDRESS_SANITIZER "enable address sanitizer support" OFF )
+option ( ENABLE_THREAD_SANITIZER "enable thread sanitizer support" OFF )
+option ( ENABLE_UB_SANITIZER "enable undefined behavior sanitizer support" OFF )
+option ( ENABLE_CODE_COVERAGE "Whether to enable code coverage support" OFF )
+
--builddir= The build directory
--generator= run cmake --help for a list of generators
--prefix= Snort++ installation prefix
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-code-coverage Whether to enable code coverage support
+ --enable-debug enable debugging options (bugreports and developers
+ only)
+ --disable-gdb disable gdb debugging information
+ --enable-address-sanitizer
+ enable address sanitizer support
+ --enable-thread-sanitizer
+ enable thread sanitizer support
+ --enable-ub-sanitizer
+ enable undefined behavior sanitizer support
"
sourcedir="$( cd "$( dirname "$0" )" && pwd )"
--builddir=*)
builddir=$optarg
;;
+ --define=*)
+ CMakeCacheEntries="$CMakeCacheEntries -D$optarg"
+ ;;
--generator=*)
CMakeGenerator="$optarg"
;;
prefix=$optarg
append_cache_entry CMAKE_INSTALL_PREFIX PATH $optarg
;;
+ --enable-code-coverage)
+ append_cache_entry ENABLE_CODE_COVERAGE BOOL true
+ ;;
+ --disable-code-coverage)
+ append_cache_entry ENABLE_CODE_COVERAGE BOOL false
+ ;;
+ --enable-debug)
+ append_cache_entry ENABLE_DEBUG BOOL true
+ ;;
+ --disable-debug)
+ append_cache_entry ENABLE_DEBUG BOOL false
+ ;;
+ --enable-gdb)
+ append_cache_entry ENABLE_GDB BOOL true
+ ;;
+ --disable-gdb)
+ append_cache_entry ENABLE_GDB BOOL false
+ ;;
+ --enable-address-sanitizer)
+ append_cache_entry ENABLE_ADDRESS_SANITIZER BOOL true
+ ;;
+ --disable-address-sanitizer)
+ append_cache_entry ENABLE_ADDRESS_SANITIZER BOOL false
+ ;;
+ --enable-thread-sanitizer)
+ append_cache_entry ENABLE_THREAD_SANITIZER BOOL true
+ ;;
+ --disable-thread-sanitizer)
+ append_cache_entry ENABLE_THREAD_SANITIZER BOOL false
+ ;;
+ --enable-ub-sanitizer)
+ append_cache_entry ENABLE_UB_SANITIZER BOOL true
+ ;;
+ --disable-ub-sanitizer)
+ append_cache_entry ENABLE_UB_SANITIZER BOOL false
+ ;;
*)
echo "Invalid option '$1'. Try $0 --help to see available options."
exit 1
vector<string> list;
split(s, list);
- unsigned mask = 0;
+ unsigned long long mask = 0;
for ( const auto& p : list )
{
unsigned idx = get_index(r, t);
if ( idx < Value::mask_bits )
- mask |= (1 << idx);
+ mask |= (1ULL << idx);
}
v.set_aux(mask);
return true;
{
p->seed = nearest_prime( (rand()%m)+3191);
p->scale = nearest_prime( (rand()%m)+709);
- p->hardener = (rand()*rand()) + 133824503;
+ p->hardener = ((unsigned) rand() * rand()) + 133824503;
}
p->hash_fcn = &hashfcn_hash;
for (unsigned l=0; l<k; l++)
{
- tmp |= s[i + l] << l*8;
+ tmp |= (unsigned char) s[i + l] << l*8;
}
switch (j)
mix(a,b,c);
a += data->post_offset;
- b += data->from_end_flag << 16 | data->offset_var << 8 | data->post_offset_var;
+ b += data->from_end_flag << 16 | (uint32_t) data->offset_var << 8 | data->post_offset_var;
c += data->bitmask_val;
mix(a,b,c);
mix(a,b,c);
a += data->offset;
- b += (data->rvalue_var << 24 |
- data->offset_var << 16 |
- data->result_var << 8 |
+ b += ((uint32_t) data->rvalue_var << 24 |
+ (uint32_t) data->offset_var << 16 |
+ (uint32_t) data->result_var << 8 |
data->endianess);
c += data->base;
{
work = new Binding;
unsplit_nets = false;
+ unsplit_ports = false;
use_name_count = 0;
use_type_count = 0;
}
unsigned i = 0;
MagicPage* p = root;
+ // Perform a longest prefix match before inserting the pattern.
while ( i < hv.size() )
{
int c = toupper(hv[i]);
if ( c == WILD && p->any )
p = p->any;
- else if ( p->next[c] )
+ else if ( c != WILD && p->next[c] )
p = p->next[c];
else