mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
Merge branch 'github_develop' into github_master
This commit is contained in:
commit
c37166d52b
17
CHANGELOG.md
17
CHANGELOG.md
@ -2,6 +2,23 @@
|
|||||||
|
|
||||||
This is a list of notable changes to Hyperscan, in reverse chronological order.
|
This is a list of notable changes to Hyperscan, in reverse chronological order.
|
||||||
|
|
||||||
|
## [5.4.1] 2023-02-20
|
||||||
|
- The Intel Hyperscan team is pleased to provide a bug fix release to our open source library.
|
||||||
|
Intel also maintains an upgraded version available through your Intel sales representative.
|
||||||
|
- Bugfix for issue #184: fix random char value of UTF-8.
|
||||||
|
- Bugfix for issue #291: bypass logical combination flag in hs_expression_info().
|
||||||
|
- Bugfix for issue #292: fix build error due to libc symbol parsing.
|
||||||
|
- Bugfix for issue #302/304: add empty string check for pure literal API.
|
||||||
|
- Bugfix for issue #303: fix unknown instruction error in pure literal API.
|
||||||
|
- Bugfix for issue #303: avoid memory leak in stream close stage.
|
||||||
|
- Bugfix for issue #305: fix assertion failure in DFA construction.
|
||||||
|
- Bugfix for issue #317: fix aligned allocator segment faults.
|
||||||
|
- Bugfix for issue #350: add quick validity check for scratch.
|
||||||
|
- Bugfix for issue #359: fix glibc-2.34 stack size issue.
|
||||||
|
- Bugfix for issue #360: fix SKIP flag issue in chimera.
|
||||||
|
- Bugfix for issue #362: fix one cotec check corner issue in UTF-8 validation.
|
||||||
|
- Fix other compile issues.
|
||||||
|
|
||||||
## [5.4.0] 2020-12-31
|
## [5.4.0] 2020-12-31
|
||||||
- Improvement on literal matcher "Fat Teddy" performance, including
|
- Improvement on literal matcher "Fat Teddy" performance, including
|
||||||
support for Intel(R) AVX-512 Vector Byte Manipulation Instructions (Intel(R)
|
support for Intel(R) AVX-512 Vector Byte Manipulation Instructions (Intel(R)
|
||||||
|
@ -3,7 +3,7 @@ project (hyperscan C CXX)
|
|||||||
|
|
||||||
set (HS_MAJOR_VERSION 5)
|
set (HS_MAJOR_VERSION 5)
|
||||||
set (HS_MINOR_VERSION 4)
|
set (HS_MINOR_VERSION 4)
|
||||||
set (HS_PATCH_VERSION 0)
|
set (HS_PATCH_VERSION 1)
|
||||||
set (HS_VERSION ${HS_MAJOR_VERSION}.${HS_MINOR_VERSION}.${HS_PATCH_VERSION})
|
set (HS_VERSION ${HS_MAJOR_VERSION}.${HS_MINOR_VERSION}.${HS_PATCH_VERSION})
|
||||||
|
|
||||||
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
|
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
|
||||||
@ -397,6 +397,18 @@ if (CXX_UNUSED_CONST_VAR)
|
|||||||
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-unused-const-variable")
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-unused-const-variable")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# clang-14 complains about unused-but-set variable.
|
||||||
|
CHECK_CXX_COMPILER_FLAG("-Wunused-but-set-variable" CXX_UNUSED_BUT_SET_VAR)
|
||||||
|
if (CXX_UNUSED_BUT_SET_VAR)
|
||||||
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-unused-but-set-variable")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# clang-14 complains about using bitwise operator instead of logical ones.
|
||||||
|
CHECK_CXX_COMPILER_FLAG("-Wbitwise-instead-of-logical" CXX_BITWISE_INSTEAD_OF_LOGICAL)
|
||||||
|
if (CXX_BITWISE_INSTEAD_OF_LOGICAL)
|
||||||
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-bitwise-instead-of-logical")
|
||||||
|
endif()
|
||||||
|
|
||||||
# gcc 6 complains about type attributes that get ignored, like alignment
|
# gcc 6 complains about type attributes that get ignored, like alignment
|
||||||
CHECK_CXX_COMPILER_FLAG("-Wignored-attributes" CXX_IGNORED_ATTR)
|
CHECK_CXX_COMPILER_FLAG("-Wignored-attributes" CXX_IGNORED_ATTR)
|
||||||
if (CXX_IGNORED_ATTR)
|
if (CXX_IGNORED_ATTR)
|
||||||
@ -428,8 +440,10 @@ CHECK_CXX_COMPILER_FLAG("-Wunused-variable" CXX_WUNUSED_VARIABLE)
|
|||||||
|
|
||||||
# gcc 10 complains about this
|
# gcc 10 complains about this
|
||||||
CHECK_C_COMPILER_FLAG("-Wstringop-overflow" CC_STRINGOP_OVERFLOW)
|
CHECK_C_COMPILER_FLAG("-Wstringop-overflow" CC_STRINGOP_OVERFLOW)
|
||||||
if(CC_STRINGOP_OVERFLOW)
|
CHECK_CXX_COMPILER_FLAG("-Wstringop-overflow" CXX_STRINGOP_OVERFLOW)
|
||||||
|
if(CC_STRINGOP_OVERFLOW OR CXX_STRINGOP_OVERFLOW)
|
||||||
set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-stringop-overflow")
|
set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-stringop-overflow")
|
||||||
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-stringop-overflow")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
@ -579,7 +593,7 @@ set (hs_exec_common_SRCS
|
|||||||
|
|
||||||
set (hs_exec_SRCS
|
set (hs_exec_SRCS
|
||||||
${hs_HEADERS}
|
${hs_HEADERS}
|
||||||
src/hs_version.h
|
src/hs_version.h.in
|
||||||
src/ue2common.h
|
src/ue2common.h
|
||||||
src/allocator.h
|
src/allocator.h
|
||||||
src/crc32.c
|
src/crc32.c
|
||||||
@ -736,7 +750,7 @@ SET (hs_compile_SRCS
|
|||||||
src/grey.h
|
src/grey.h
|
||||||
src/hs.cpp
|
src/hs.cpp
|
||||||
src/hs_internal.h
|
src/hs_internal.h
|
||||||
src/hs_version.h
|
src/hs_version.h.in
|
||||||
src/scratch.h
|
src/scratch.h
|
||||||
src/state.h
|
src/state.h
|
||||||
src/ue2common.h
|
src/ue2common.h
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2020, Intel Corporation
|
* Copyright (c) 2018-2022, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -326,6 +326,10 @@ ch_error_t catchupPcre(struct HybridContext *hyctx, unsigned int id,
|
|||||||
} else if (cbrv == CH_CALLBACK_SKIP_PATTERN) {
|
} else if (cbrv == CH_CALLBACK_SKIP_PATTERN) {
|
||||||
DEBUG_PRINTF("user callback told us to skip this pattern\n");
|
DEBUG_PRINTF("user callback told us to skip this pattern\n");
|
||||||
pd->scanStart = hyctx->length;
|
pd->scanStart = hyctx->length;
|
||||||
|
if (top_id == id) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (top_id == id) {
|
if (top_id == id) {
|
||||||
|
@ -17,7 +17,7 @@ KEEPSYMS=$(mktemp -p /tmp keep.syms.XXXXX)
|
|||||||
LIBC_SO=$("$@" --print-file-name=libc.so.6)
|
LIBC_SO=$("$@" --print-file-name=libc.so.6)
|
||||||
cp ${KEEPSYMS_IN} ${KEEPSYMS}
|
cp ${KEEPSYMS_IN} ${KEEPSYMS}
|
||||||
# get all symbols from libc and turn them into patterns
|
# get all symbols from libc and turn them into patterns
|
||||||
nm -f p -g -D ${LIBC_SO} | sed -s 's/\([^ ]*\).*/^\1$/' >> ${KEEPSYMS}
|
nm -f p -g -D ${LIBC_SO} | sed -s 's/\([^ @]*\).*/^\1$/' >> ${KEEPSYMS}
|
||||||
# build the object
|
# build the object
|
||||||
"$@"
|
"$@"
|
||||||
# rename the symbols in the object
|
# rename the symbols in the object
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2017, Intel Corporation
|
* Copyright (c) 2015-2021, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -115,6 +115,7 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <climits>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -657,6 +658,10 @@ int main(int argc, char **argv) {
|
|||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
repeatCount = atoi(optarg);
|
repeatCount = atoi(optarg);
|
||||||
|
if (repeatCount <= 0 || repeatCount > UINT_MAX) {
|
||||||
|
cerr << "Invalid repeatCount." << endl;
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2016, Intel Corporation
|
* Copyright (c) 2015-2021, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -51,6 +51,7 @@
|
|||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <climits>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -489,6 +490,10 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
// Streaming mode scans.
|
// Streaming mode scans.
|
||||||
double secsStreamingScan = 0.0, secsStreamingOpenClose = 0.0;
|
double secsStreamingScan = 0.0, secsStreamingOpenClose = 0.0;
|
||||||
|
if (repeatCount <= 0 || repeatCount > UINT_MAX) {
|
||||||
|
cerr << "Invalid repeatCount." << endl;
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
for (unsigned int i = 0; i < repeatCount; i++) {
|
for (unsigned int i = 0; i < repeatCount; i++) {
|
||||||
// Open streams.
|
// Open streams.
|
||||||
clock.start();
|
clock.start();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015, Intel Corporation
|
* Copyright (c) 2015-2021, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -57,6 +57,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <hs.h>
|
#include <hs.h>
|
||||||
|
|
||||||
@ -152,6 +153,15 @@ int main(int argc, char *argv[]) {
|
|||||||
char *pattern = argv[1];
|
char *pattern = argv[1];
|
||||||
char *inputFN = argv[2];
|
char *inputFN = argv[2];
|
||||||
|
|
||||||
|
if (access(inputFN, F_OK) != 0) {
|
||||||
|
fprintf(stderr, "ERROR: file doesn't exist.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (access(inputFN, R_OK) != 0) {
|
||||||
|
fprintf(stderr, "ERROR: can't be read.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* First, we attempt to compile the pattern provided on the command line.
|
/* First, we attempt to compile the pattern provided on the command line.
|
||||||
* We assume 'DOTALL' semantics, meaning that the '.' meta-character will
|
* We assume 'DOTALL' semantics, meaning that the '.' meta-character will
|
||||||
* match newline characters. The compiler will analyse the given pattern and
|
* match newline characters. The compiler will analyse the given pattern and
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2020, Intel Corporation
|
* Copyright (c) 2015-2021, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -323,7 +323,8 @@ void addExpression(NG &ng, unsigned index, const char *expression,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ensure that our pattern isn't too long (in characters).
|
// Ensure that our pattern isn't too long (in characters).
|
||||||
if (strlen(expression) > cc.grey.limitPatternLength) {
|
size_t maxlen = cc.grey.limitPatternLength + 1;
|
||||||
|
if (strnlen(expression, maxlen) >= maxlen) {
|
||||||
throw CompileError("Pattern length exceeds limit.");
|
throw CompileError("Pattern length exceeds limit.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,6 +417,10 @@ void addLitExpression(NG &ng, unsigned index, const char *expression,
|
|||||||
"HS_FLAG_SOM_LEFTMOST are supported in literal API.");
|
"HS_FLAG_SOM_LEFTMOST are supported in literal API.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!strcmp(expression, "")) {
|
||||||
|
throw CompileError("Pure literal API doesn't support empty string.");
|
||||||
|
}
|
||||||
|
|
||||||
// This expression must be a pure literal, we can build ue2_literal
|
// This expression must be a pure literal, we can build ue2_literal
|
||||||
// directly based on expression text.
|
// directly based on expression text.
|
||||||
ParsedLitExpression ple(index, expression, expLength, flags, id);
|
ParsedLitExpression ple(index, expression, expLength, flags, id);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2020, Intel Corporation
|
* Copyright (c) 2015-2021, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -514,6 +514,12 @@ hs_error_t hs_expression_info_int(const char *expression, unsigned int flags,
|
|||||||
return HS_COMPILER_ERROR;
|
return HS_COMPILER_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flags & HS_FLAG_COMBINATION) {
|
||||||
|
*error = generateCompileError("Invalid parameter: unsupported "
|
||||||
|
"logical combination expression", -1);
|
||||||
|
return HS_COMPILER_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
*info = nullptr;
|
*info = nullptr;
|
||||||
*error = nullptr;
|
*error = nullptr;
|
||||||
|
|
||||||
|
2
src/hs.h
2
src/hs.h
@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
#define HS_MAJOR 5
|
#define HS_MAJOR 5
|
||||||
#define HS_MINOR 4
|
#define HS_MINOR 4
|
||||||
#define HS_PATCH 0
|
#define HS_PATCH 1
|
||||||
|
|
||||||
#include "hs_compile.h"
|
#include "hs_compile.h"
|
||||||
#include "hs_runtime.h"
|
#include "hs_runtime.h"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2020, Intel Corporation
|
* Copyright (c) 2015-2021, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -748,10 +748,7 @@ hs_error_t HS_CDECL hs_free_compile_error(hs_compile_error_t *error);
|
|||||||
* - HS_FLAG_PREFILTER - Compile pattern in prefiltering mode.
|
* - HS_FLAG_PREFILTER - Compile pattern in prefiltering mode.
|
||||||
* - HS_FLAG_SOM_LEFTMOST - Report the leftmost start of match offset
|
* - HS_FLAG_SOM_LEFTMOST - Report the leftmost start of match offset
|
||||||
* when a match is found.
|
* when a match is found.
|
||||||
* - HS_FLAG_COMBINATION - Parse the expression in logical combination
|
* - HS_FLAG_QUIET - This flag will be ignored.
|
||||||
* syntax.
|
|
||||||
* - HS_FLAG_QUIET - Ignore match reporting for this expression. Used for
|
|
||||||
* the sub-expressions in logical combinations.
|
|
||||||
*
|
*
|
||||||
* @param info
|
* @param info
|
||||||
* On success, a pointer to the pattern information will be returned in
|
* On success, a pointer to the pattern information will be returned in
|
||||||
@ -814,10 +811,7 @@ hs_error_t HS_CDECL hs_expression_info(const char *expression,
|
|||||||
* - HS_FLAG_PREFILTER - Compile pattern in prefiltering mode.
|
* - HS_FLAG_PREFILTER - Compile pattern in prefiltering mode.
|
||||||
* - HS_FLAG_SOM_LEFTMOST - Report the leftmost start of match offset
|
* - HS_FLAG_SOM_LEFTMOST - Report the leftmost start of match offset
|
||||||
* when a match is found.
|
* when a match is found.
|
||||||
* - HS_FLAG_COMBINATION - Parse the expression in logical combination
|
* - HS_FLAG_QUIET - This flag will be ignored.
|
||||||
* syntax.
|
|
||||||
* - HS_FLAG_QUIET - Ignore match reporting for this expression. Used for
|
|
||||||
* the sub-expressions in logical combinations.
|
|
||||||
*
|
*
|
||||||
* @param ext
|
* @param ext
|
||||||
* A pointer to a filled @ref hs_expr_ext_t structure that defines
|
* A pointer to a filled @ref hs_expr_ext_t structure that defines
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019, Intel Corporation
|
* Copyright (c) 2019-2021, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -80,7 +80,9 @@ extern "C"
|
|||||||
| HS_FLAG_PREFILTER \
|
| HS_FLAG_PREFILTER \
|
||||||
| HS_FLAG_SINGLEMATCH \
|
| HS_FLAG_SINGLEMATCH \
|
||||||
| HS_FLAG_ALLOWEMPTY \
|
| HS_FLAG_ALLOWEMPTY \
|
||||||
| HS_FLAG_SOM_LEFTMOST)
|
| HS_FLAG_SOM_LEFTMOST \
|
||||||
|
| HS_FLAG_COMBINATION \
|
||||||
|
| HS_FLAG_QUIET)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
|
@ -106,7 +106,7 @@ hwlm_error_t scanDoubleShort(const struct noodTable *n, const u8 *buf,
|
|||||||
if (!l) {
|
if (!l) {
|
||||||
return HWLM_SUCCESS;
|
return HWLM_SUCCESS;
|
||||||
}
|
}
|
||||||
assert(l <= 32);
|
assert(l <= 16);
|
||||||
|
|
||||||
DEBUG_PRINTF("d %zu\n", d - buf);
|
DEBUG_PRINTF("d %zu\n", d - buf);
|
||||||
m128 v = zeroes128();
|
m128 v = zeroes128();
|
||||||
|
@ -207,6 +207,10 @@ void makeCFG_top_edge(GoughGraph &cfg, const vector<GoughVertex> &vertices,
|
|||||||
assert(contains(src_slots, slot_id));
|
assert(contains(src_slots, slot_id));
|
||||||
|
|
||||||
shared_ptr<GoughSSAVarMin> vmin = make_shared<GoughSSAVarMin>();
|
shared_ptr<GoughSSAVarMin> vmin = make_shared<GoughSSAVarMin>();
|
||||||
|
if (!vmin) {
|
||||||
|
assert(0);
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
cfg[e].vars.push_back(vmin);
|
cfg[e].vars.push_back(vmin);
|
||||||
final_var = vmin.get();
|
final_var = vmin.get();
|
||||||
|
|
||||||
@ -318,6 +322,10 @@ void makeCFG_edge(GoughGraph &cfg, const map<u32, u32> &som_creators,
|
|||||||
DEBUG_PRINTF("bypassing min on join %u\n", slot_id);
|
DEBUG_PRINTF("bypassing min on join %u\n", slot_id);
|
||||||
} else {
|
} else {
|
||||||
shared_ptr<GoughSSAVarMin> vmin = make_shared<GoughSSAVarMin>();
|
shared_ptr<GoughSSAVarMin> vmin = make_shared<GoughSSAVarMin>();
|
||||||
|
if (!vmin) {
|
||||||
|
assert(0);
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
cfg[e].vars.push_back(vmin);
|
cfg[e].vars.push_back(vmin);
|
||||||
final_var = vmin.get();
|
final_var = vmin.get();
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2020, Intel Corporation
|
* Copyright (c) 2015-2021, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -1082,7 +1082,9 @@ void find_better_daddy(dfa_info &info, dstate_id_t curr_id, bool using8bit,
|
|||||||
// Use the daddy already set for this state so long as it isn't already
|
// Use the daddy already set for this state so long as it isn't already
|
||||||
// a Sherman state.
|
// a Sherman state.
|
||||||
dstate_id_t daddy = currState.daddy;
|
dstate_id_t daddy = currState.daddy;
|
||||||
if (!info.is_sherman(daddy) && !info.is_widestate(daddy)) {
|
if (info.is_widestate(daddy)) {
|
||||||
|
return;
|
||||||
|
} else if (!info.is_sherman(daddy)) {
|
||||||
hinted.insert(currState.daddy);
|
hinted.insert(currState.daddy);
|
||||||
} else {
|
} else {
|
||||||
// Fall back to granddaddy, which has already been processed (due
|
// Fall back to granddaddy, which has already been processed (due
|
||||||
|
@ -75,6 +75,7 @@ namespace ue2 {
|
|||||||
DISPATCH_CASE(LBR_NFA_VERM, LbrVerm, dbnt_func); \
|
DISPATCH_CASE(LBR_NFA_VERM, LbrVerm, dbnt_func); \
|
||||||
DISPATCH_CASE(LBR_NFA_NVERM, LbrNVerm, dbnt_func); \
|
DISPATCH_CASE(LBR_NFA_NVERM, LbrNVerm, dbnt_func); \
|
||||||
DISPATCH_CASE(LBR_NFA_SHUF, LbrShuf, dbnt_func); \
|
DISPATCH_CASE(LBR_NFA_SHUF, LbrShuf, dbnt_func); \
|
||||||
|
DISPATCH_CASE(LBR_NFA_VSHUF, LbrVShuf, dbnt_func); \
|
||||||
DISPATCH_CASE(LBR_NFA_TRUF, LbrTruf, dbnt_func); \
|
DISPATCH_CASE(LBR_NFA_TRUF, LbrTruf, dbnt_func); \
|
||||||
DISPATCH_CASE(CASTLE_NFA, Castle, dbnt_func); \
|
DISPATCH_CASE(CASTLE_NFA, Castle, dbnt_func); \
|
||||||
DISPATCH_CASE(SHENG_NFA, Sheng, dbnt_func); \
|
DISPATCH_CASE(SHENG_NFA, Sheng, dbnt_func); \
|
||||||
|
@ -124,6 +124,10 @@ RepeatStateInfo::RepeatStateInfo(enum RepeatType type, const depth &repeatMin,
|
|||||||
const depth &repeatMax, u32 minPeriod)
|
const depth &repeatMax, u32 minPeriod)
|
||||||
: stateSize(0), packedCtrlSize(0), horizon(0), patchCount(0),
|
: stateSize(0), packedCtrlSize(0), horizon(0), patchCount(0),
|
||||||
patchSize(0), encodingSize(0), patchesOffset(0) {
|
patchSize(0), encodingSize(0), patchesOffset(0) {
|
||||||
|
if (type == REPEAT_SPARSE_OPTIMAL_P && minPeriod == 0) {
|
||||||
|
assert(0);
|
||||||
|
throw std::domain_error("SPARSE_OPTIMAL_P must have non-zero minPeriod.");
|
||||||
|
}
|
||||||
assert(repeatMin <= repeatMax);
|
assert(repeatMin <= repeatMax);
|
||||||
assert(repeatMax.is_reachable());
|
assert(repeatMax.is_reachable());
|
||||||
assert(minPeriod || type != REPEAT_SPARSE_OPTIMAL_P);
|
assert(minPeriod || type != REPEAT_SPARSE_OPTIMAL_P);
|
||||||
|
@ -2446,6 +2446,10 @@ static
|
|||||||
bool doLitHaigSom(NG &ng, NGHolder &g, som_type som) {
|
bool doLitHaigSom(NG &ng, NGHolder &g, som_type som) {
|
||||||
ue2_literal lit;
|
ue2_literal lit;
|
||||||
shared_ptr<NGHolder> rhs = make_shared<NGHolder>();
|
shared_ptr<NGHolder> rhs = make_shared<NGHolder>();
|
||||||
|
if (!rhs) {
|
||||||
|
assert(0);
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
if (!ng.cc.grey.allowLitHaig) {
|
if (!ng.cc.grey.allowLitHaig) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2510,6 +2514,11 @@ bool doHaigLitHaigSom(NG &ng, NGHolder &g,
|
|||||||
ue2_literal lit;
|
ue2_literal lit;
|
||||||
shared_ptr<NGHolder> rhs = make_shared<NGHolder>();
|
shared_ptr<NGHolder> rhs = make_shared<NGHolder>();
|
||||||
shared_ptr<NGHolder> lhs = make_shared<NGHolder>();
|
shared_ptr<NGHolder> lhs = make_shared<NGHolder>();
|
||||||
|
if (!rhs || !lhs) {
|
||||||
|
assert(0);
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
|
||||||
if (!splitOffBestLiteral(g, regions, &lit, &*lhs, &*rhs, ng.cc)) {
|
if (!splitOffBestLiteral(g, regions, &lit, &*lhs, &*rhs, ng.cc)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1036,6 +1036,11 @@ bool splitRoseEdge(const NGHolder &base_graph, RoseInGraph &vg,
|
|||||||
shared_ptr<NGHolder> lhs = make_shared<NGHolder>();
|
shared_ptr<NGHolder> lhs = make_shared<NGHolder>();
|
||||||
shared_ptr<NGHolder> rhs = make_shared<NGHolder>();
|
shared_ptr<NGHolder> rhs = make_shared<NGHolder>();
|
||||||
|
|
||||||
|
if (!lhs || !rhs) {
|
||||||
|
assert(0);
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
|
||||||
unordered_map<NFAVertex, NFAVertex> lhs_map;
|
unordered_map<NFAVertex, NFAVertex> lhs_map;
|
||||||
unordered_map<NFAVertex, NFAVertex> rhs_map;
|
unordered_map<NFAVertex, NFAVertex> rhs_map;
|
||||||
|
|
||||||
@ -1229,6 +1234,10 @@ void splitEdgesByCut(NGHolder &h, RoseInGraph &vg,
|
|||||||
DEBUG_PRINTF("splitting on pivot %zu\n", h[pivot].index);
|
DEBUG_PRINTF("splitting on pivot %zu\n", h[pivot].index);
|
||||||
unordered_map<NFAVertex, NFAVertex> temp_map;
|
unordered_map<NFAVertex, NFAVertex> temp_map;
|
||||||
shared_ptr<NGHolder> new_lhs = make_shared<NGHolder>();
|
shared_ptr<NGHolder> new_lhs = make_shared<NGHolder>();
|
||||||
|
if (!new_lhs) {
|
||||||
|
assert(0);
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
splitLHS(h, pivot, new_lhs.get(), &temp_map);
|
splitLHS(h, pivot, new_lhs.get(), &temp_map);
|
||||||
|
|
||||||
/* want to cut off paths to pivot from things other than the pivot -
|
/* want to cut off paths to pivot from things other than the pivot -
|
||||||
@ -1310,6 +1319,10 @@ void splitEdgesByCut(NGHolder &h, RoseInGraph &vg,
|
|||||||
if (!contains(done_rhs, adj)) {
|
if (!contains(done_rhs, adj)) {
|
||||||
unordered_map<NFAVertex, NFAVertex> temp_map;
|
unordered_map<NFAVertex, NFAVertex> temp_map;
|
||||||
shared_ptr<NGHolder> new_rhs = make_shared<NGHolder>();
|
shared_ptr<NGHolder> new_rhs = make_shared<NGHolder>();
|
||||||
|
if (!new_rhs) {
|
||||||
|
assert(0);
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
splitRHS(h, adj, new_rhs.get(), &temp_map);
|
splitRHS(h, adj, new_rhs.get(), &temp_map);
|
||||||
remove_edge(new_rhs->start, new_rhs->accept, *new_rhs);
|
remove_edge(new_rhs->start, new_rhs->accept, *new_rhs);
|
||||||
remove_edge(new_rhs->start, new_rhs->acceptEod, *new_rhs);
|
remove_edge(new_rhs->start, new_rhs->acceptEod, *new_rhs);
|
||||||
@ -2281,6 +2294,10 @@ void splitEdgesForSuffix(const NGHolder &base_graph, RoseInGraph &vg,
|
|||||||
assert(!splitters.empty());
|
assert(!splitters.empty());
|
||||||
|
|
||||||
shared_ptr<NGHolder> lhs = make_shared<NGHolder>();
|
shared_ptr<NGHolder> lhs = make_shared<NGHolder>();
|
||||||
|
if (!lhs) {
|
||||||
|
assert(0);
|
||||||
|
throw bad_alloc();
|
||||||
|
}
|
||||||
unordered_map<NFAVertex, NFAVertex> v_map;
|
unordered_map<NFAVertex, NFAVertex> v_map;
|
||||||
cloneHolder(*lhs, base_graph, &v_map);
|
cloneHolder(*lhs, base_graph, &v_map);
|
||||||
lhs->kind = NFA_INFIX;
|
lhs->kind = NFA_INFIX;
|
||||||
|
@ -140,7 +140,8 @@ void ParsedLogical::validateSubIDs(const unsigned *ids,
|
|||||||
}
|
}
|
||||||
hs_compile_error_t *compile_err = NULL;
|
hs_compile_error_t *compile_err = NULL;
|
||||||
hs_expr_info_t *info = NULL;
|
hs_expr_info_t *info = NULL;
|
||||||
hs_error_t err = hs_expression_info(expressions[i], flags[i], &info,
|
hs_error_t err = hs_expression_info(expressions[i],
|
||||||
|
flags ? flags[i] : 0, &info,
|
||||||
&compile_err);
|
&compile_err);
|
||||||
if (err != HS_SUCCESS) {
|
if (err != HS_SUCCESS) {
|
||||||
hs_free_compile_error(compile_err);
|
hs_free_compile_error(compile_err);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015, Intel Corporation
|
* Copyright (c) 2015-2022, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -72,7 +72,7 @@ bool isValidUtf8(const char *expression, const size_t len) {
|
|||||||
while (i < len) {
|
while (i < len) {
|
||||||
DEBUG_PRINTF("byte %zu: 0x%02x\n", i, s[i]);
|
DEBUG_PRINTF("byte %zu: 0x%02x\n", i, s[i]);
|
||||||
// One octet.
|
// One octet.
|
||||||
if (s[i] < 0x7f) {
|
if (s[i] <= 0x7f) {
|
||||||
DEBUG_PRINTF("one octet\n");
|
DEBUG_PRINTF("one octet\n");
|
||||||
i++;
|
i++;
|
||||||
continue;
|
continue;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2020, Intel Corporation
|
* Copyright (c) 2015-2021, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -3110,6 +3110,7 @@ hwlmcb_rv_t roseRunProgram_l(const struct RoseEngine *t,
|
|||||||
|
|
||||||
const char in_catchup = prog_flags & ROSE_PROG_FLAG_IN_CATCHUP;
|
const char in_catchup = prog_flags & ROSE_PROG_FLAG_IN_CATCHUP;
|
||||||
const char from_mpv = prog_flags & ROSE_PROG_FLAG_FROM_MPV;
|
const char from_mpv = prog_flags & ROSE_PROG_FLAG_FROM_MPV;
|
||||||
|
const char skip_mpv_catchup = prog_flags & ROSE_PROG_FLAG_SKIP_MPV_CATCHUP;
|
||||||
|
|
||||||
const char *pc_base = getByOffset(t, programOffset);
|
const char *pc_base = getByOffset(t, programOffset);
|
||||||
const char *pc = pc_base;
|
const char *pc = pc_base;
|
||||||
@ -3206,6 +3207,17 @@ hwlmcb_rv_t roseRunProgram_l(const struct RoseEngine *t,
|
|||||||
}
|
}
|
||||||
L_PROGRAM_NEXT_INSTRUCTION
|
L_PROGRAM_NEXT_INSTRUCTION
|
||||||
|
|
||||||
|
L_PROGRAM_CASE(CATCH_UP_MPV) {
|
||||||
|
if (from_mpv || skip_mpv_catchup) {
|
||||||
|
DEBUG_PRINTF("skipping mpv catchup\n");
|
||||||
|
} else if (roseCatchUpMPV(t,
|
||||||
|
end - scratch->core_info.buf_offset,
|
||||||
|
scratch) == HWLM_TERMINATE_MATCHING) {
|
||||||
|
return HWLM_TERMINATE_MATCHING;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
L_PROGRAM_NEXT_INSTRUCTION
|
||||||
|
|
||||||
L_PROGRAM_CASE(SOM_FROM_REPORT) {
|
L_PROGRAM_CASE(SOM_FROM_REPORT) {
|
||||||
som = handleSomExternal(scratch, &ri->som, end);
|
som = handleSomExternal(scratch, &ri->som, end);
|
||||||
DEBUG_PRINTF("som from report %u is %llu\n", ri->som.onmatch,
|
DEBUG_PRINTF("som from report %u is %llu\n", ri->som.onmatch,
|
||||||
@ -3213,6 +3225,15 @@ hwlmcb_rv_t roseRunProgram_l(const struct RoseEngine *t,
|
|||||||
}
|
}
|
||||||
L_PROGRAM_NEXT_INSTRUCTION
|
L_PROGRAM_NEXT_INSTRUCTION
|
||||||
|
|
||||||
|
L_PROGRAM_CASE(TRIGGER_SUFFIX) {
|
||||||
|
if (roseTriggerSuffix(t, scratch, ri->queue, ri->event, som,
|
||||||
|
end) == HWLM_TERMINATE_MATCHING) {
|
||||||
|
return HWLM_TERMINATE_MATCHING;
|
||||||
|
}
|
||||||
|
work_done = 1;
|
||||||
|
}
|
||||||
|
L_PROGRAM_NEXT_INSTRUCTION
|
||||||
|
|
||||||
L_PROGRAM_CASE(DEDUPE) {
|
L_PROGRAM_CASE(DEDUPE) {
|
||||||
updateSeqPoint(tctxt, end, from_mpv);
|
updateSeqPoint(tctxt, end, from_mpv);
|
||||||
const char do_som = t->hasSom; // TODO: constant propagate
|
const char do_som = t->hasSom; // TODO: constant propagate
|
||||||
|
@ -562,6 +562,10 @@ bool handleMixedPrefixCliche(const NGHolder &h, RoseGraph &g, RoseVertex v,
|
|||||||
DEBUG_PRINTF("woot?\n");
|
DEBUG_PRINTF("woot?\n");
|
||||||
|
|
||||||
shared_ptr<NGHolder> h_new = make_shared<NGHolder>();
|
shared_ptr<NGHolder> h_new = make_shared<NGHolder>();
|
||||||
|
if (!h_new) {
|
||||||
|
assert(0);
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
unordered_map<NFAVertex, NFAVertex> rhs_map;
|
unordered_map<NFAVertex, NFAVertex> rhs_map;
|
||||||
vector<NFAVertex> exits_vec;
|
vector<NFAVertex> exits_vec;
|
||||||
insert(&exits_vec, exits_vec.end(), exits);
|
insert(&exits_vec, exits_vec.end(), exits);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2019, Intel Corporation
|
* Copyright (c) 2015-2022, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -90,7 +90,7 @@ u8 *getHistory(char *state, const struct RoseEngine *t, u64a offset) {
|
|||||||
* callers.
|
* callers.
|
||||||
*/
|
*/
|
||||||
static really_inline
|
static really_inline
|
||||||
char validScratch(const struct RoseEngine *t, const struct hs_scratch *s) {
|
char validScratch(const struct hs_scratch *s, u32 crc) {
|
||||||
if (!ISALIGNED_CL(s)) {
|
if (!ISALIGNED_CL(s)) {
|
||||||
DEBUG_PRINTF("bad alignment %p\n", s);
|
DEBUG_PRINTF("bad alignment %p\n", s);
|
||||||
return 0;
|
return 0;
|
||||||
@ -101,18 +101,12 @@ char validScratch(const struct RoseEngine *t, const struct hs_scratch *s) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (t->mode == HS_MODE_BLOCK && t->stateOffsets.end > s->bStateSize) {
|
/* add quick rose sanity checks by db crc*/
|
||||||
DEBUG_PRINTF("bad state size\n");
|
if (s->db_crc != crc) {
|
||||||
|
DEBUG_PRINTF("Improper scratch for current db\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (t->queueCount > s->queueCount) {
|
|
||||||
DEBUG_PRINTF("bad queue count\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO: add quick rose sanity checks */
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -335,7 +329,7 @@ hs_error_t HS_CDECL hs_scan(const hs_database_t *db, const char *data,
|
|||||||
return HS_DB_MODE_ERROR;
|
return HS_DB_MODE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(!validScratch(rose, scratch))) {
|
if (unlikely(!validScratch(scratch, db->crc32))) {
|
||||||
return HS_INVALID;
|
return HS_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -509,7 +503,7 @@ void maintainHistoryBuffer(const struct RoseEngine *rose, char *state,
|
|||||||
|
|
||||||
static really_inline
|
static really_inline
|
||||||
void init_stream(struct hs_stream *s, const struct RoseEngine *rose,
|
void init_stream(struct hs_stream *s, const struct RoseEngine *rose,
|
||||||
char init_history) {
|
char init_history, u32 crc) {
|
||||||
char *state = getMultiState(s);
|
char *state = getMultiState(s);
|
||||||
|
|
||||||
if (init_history) {
|
if (init_history) {
|
||||||
@ -524,6 +518,7 @@ void init_stream(struct hs_stream *s, const struct RoseEngine *rose,
|
|||||||
|
|
||||||
s->rose = rose;
|
s->rose = rose;
|
||||||
s->offset = 0;
|
s->offset = 0;
|
||||||
|
s->crc32 = crc;
|
||||||
|
|
||||||
setStreamStatus(state, 0);
|
setStreamStatus(state, 0);
|
||||||
roseInitState(rose, state);
|
roseInitState(rose, state);
|
||||||
@ -568,7 +563,7 @@ hs_error_t HS_CDECL hs_open_stream(const hs_database_t *db,
|
|||||||
return HS_NOMEM;
|
return HS_NOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
init_stream(s, rose, 1);
|
init_stream(s, rose, 1, db->crc32);
|
||||||
|
|
||||||
*stream = s;
|
*stream = s;
|
||||||
return HS_SUCCESS;
|
return HS_SUCCESS;
|
||||||
@ -756,7 +751,7 @@ hs_error_t HS_CDECL hs_reset_and_copy_stream(hs_stream_t *to_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (onEvent) {
|
if (onEvent) {
|
||||||
if (!scratch || !validScratch(to_id->rose, scratch)) {
|
if (!scratch || !validScratch(scratch, to_id->crc32)) {
|
||||||
return HS_INVALID;
|
return HS_INVALID;
|
||||||
}
|
}
|
||||||
if (unlikely(markScratchInUse(scratch))) {
|
if (unlikely(markScratchInUse(scratch))) {
|
||||||
@ -982,7 +977,7 @@ hs_error_t HS_CDECL hs_scan_stream(hs_stream_t *id, const char *data,
|
|||||||
hs_scratch_t *scratch,
|
hs_scratch_t *scratch,
|
||||||
match_event_handler onEvent, void *context) {
|
match_event_handler onEvent, void *context) {
|
||||||
if (unlikely(!id || !scratch || !data ||
|
if (unlikely(!id || !scratch || !data ||
|
||||||
!validScratch(id->rose, scratch))) {
|
!validScratch(scratch, id->crc32))) {
|
||||||
return HS_INVALID;
|
return HS_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1004,7 +999,7 @@ hs_error_t HS_CDECL hs_close_stream(hs_stream_t *id, hs_scratch_t *scratch,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (onEvent) {
|
if (onEvent) {
|
||||||
if (!scratch || !validScratch(id->rose, scratch)) {
|
if (!scratch || !validScratch(scratch, id->crc32)) {
|
||||||
return HS_INVALID;
|
return HS_INVALID;
|
||||||
}
|
}
|
||||||
if (unlikely(markScratchInUse(scratch))) {
|
if (unlikely(markScratchInUse(scratch))) {
|
||||||
@ -1013,6 +1008,7 @@ hs_error_t HS_CDECL hs_close_stream(hs_stream_t *id, hs_scratch_t *scratch,
|
|||||||
report_eod_matches(id, scratch, onEvent, context);
|
report_eod_matches(id, scratch, onEvent, context);
|
||||||
if (unlikely(internal_matching_error(scratch))) {
|
if (unlikely(internal_matching_error(scratch))) {
|
||||||
unmarkScratchInUse(scratch);
|
unmarkScratchInUse(scratch);
|
||||||
|
hs_stream_free(id);
|
||||||
return HS_UNKNOWN_ERROR;
|
return HS_UNKNOWN_ERROR;
|
||||||
}
|
}
|
||||||
unmarkScratchInUse(scratch);
|
unmarkScratchInUse(scratch);
|
||||||
@ -1033,7 +1029,7 @@ hs_error_t HS_CDECL hs_reset_stream(hs_stream_t *id, UNUSED unsigned int flags,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (onEvent) {
|
if (onEvent) {
|
||||||
if (!scratch || !validScratch(id->rose, scratch)) {
|
if (!scratch || !validScratch(scratch, id->crc32)) {
|
||||||
return HS_INVALID;
|
return HS_INVALID;
|
||||||
}
|
}
|
||||||
if (unlikely(markScratchInUse(scratch))) {
|
if (unlikely(markScratchInUse(scratch))) {
|
||||||
@ -1048,7 +1044,7 @@ hs_error_t HS_CDECL hs_reset_stream(hs_stream_t *id, UNUSED unsigned int flags,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// history already initialised
|
// history already initialised
|
||||||
init_stream(id, id->rose, 0);
|
init_stream(id, id->rose, 0, id->crc32);
|
||||||
|
|
||||||
return HS_SUCCESS;
|
return HS_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -1127,7 +1123,7 @@ hs_error_t HS_CDECL hs_scan_vector(const hs_database_t *db,
|
|||||||
return HS_DB_MODE_ERROR;
|
return HS_DB_MODE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(!validScratch(rose, scratch))) {
|
if (unlikely(!validScratch(scratch, db->crc32))) {
|
||||||
return HS_INVALID;
|
return HS_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1137,7 +1133,7 @@ hs_error_t HS_CDECL hs_scan_vector(const hs_database_t *db,
|
|||||||
|
|
||||||
hs_stream_t *id = (hs_stream_t *)(scratch->bstate);
|
hs_stream_t *id = (hs_stream_t *)(scratch->bstate);
|
||||||
|
|
||||||
init_stream(id, rose, 1); /* open stream */
|
init_stream(id, rose, 1, db->crc32); /* open stream */
|
||||||
|
|
||||||
for (u32 i = 0; i < count; i++) {
|
for (u32 i = 0; i < count; i++) {
|
||||||
DEBUG_PRINTF("block %u/%u offset=%llu len=%u\n", i, count, id->offset,
|
DEBUG_PRINTF("block %u/%u offset=%llu len=%u\n", i, count, id->offset,
|
||||||
@ -1252,7 +1248,7 @@ hs_error_t HS_CDECL hs_reset_and_expand_stream(hs_stream_t *to_stream,
|
|||||||
const struct RoseEngine *rose = to_stream->rose;
|
const struct RoseEngine *rose = to_stream->rose;
|
||||||
|
|
||||||
if (onEvent) {
|
if (onEvent) {
|
||||||
if (!scratch || !validScratch(to_stream->rose, scratch)) {
|
if (!scratch || !validScratch(scratch, to_stream->crc32)) {
|
||||||
return HS_INVALID;
|
return HS_INVALID;
|
||||||
}
|
}
|
||||||
if (unlikely(markScratchInUse(scratch))) {
|
if (unlikely(markScratchInUse(scratch))) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2019, Intel Corporation
|
* Copyright (c) 2015-2022, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -373,6 +373,7 @@ hs_error_t HS_CDECL hs_alloc_scratch(const hs_database_t *db,
|
|||||||
hs_scratch_free((*scratch)->scratch_alloc);
|
hs_scratch_free((*scratch)->scratch_alloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proto->db_crc = db->crc32;
|
||||||
hs_error_t alloc_ret = alloc_scratch(proto, scratch);
|
hs_error_t alloc_ret = alloc_scratch(proto, scratch);
|
||||||
hs_scratch_free(proto_tmp); /* kill off temp used for sizing */
|
hs_scratch_free(proto_tmp); /* kill off temp used for sizing */
|
||||||
if (alloc_ret != HS_SUCCESS) {
|
if (alloc_ret != HS_SUCCESS) {
|
||||||
@ -380,6 +381,7 @@ hs_error_t HS_CDECL hs_alloc_scratch(const hs_database_t *db,
|
|||||||
return alloc_ret;
|
return alloc_ret;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
(*scratch)->db_crc = db->crc32;
|
||||||
hs_scratch_free(proto_tmp); /* kill off temp used for sizing */
|
hs_scratch_free(proto_tmp); /* kill off temp used for sizing */
|
||||||
unmarkScratchInUse(*scratch);
|
unmarkScratchInUse(*scratch);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2019, Intel Corporation
|
* Copyright (c) 2015-2022, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -171,6 +171,7 @@ struct match_deduper {
|
|||||||
*/
|
*/
|
||||||
struct ALIGN_CL_DIRECTIVE hs_scratch {
|
struct ALIGN_CL_DIRECTIVE hs_scratch {
|
||||||
u32 magic;
|
u32 magic;
|
||||||
|
u32 db_crc; /**< identity of a scratch space, for validity check */
|
||||||
u8 in_use; /**< non-zero when being used by an API call. */
|
u8 in_use; /**< non-zero when being used by an API call. */
|
||||||
u32 queueCount;
|
u32 queueCount;
|
||||||
u32 activeQueueArraySize; /**< size of active queue array fatbit in bytes */
|
u32 activeQueueArraySize; /**< size of active queue array fatbit in bytes */
|
||||||
|
@ -78,7 +78,7 @@ namespace ue2 {
|
|||||||
struct LitTrieVertexProps {
|
struct LitTrieVertexProps {
|
||||||
LitTrieVertexProps() = default;
|
LitTrieVertexProps() = default;
|
||||||
explicit LitTrieVertexProps(u8 c_in) : c(c_in) {}
|
explicit LitTrieVertexProps(u8 c_in) : c(c_in) {}
|
||||||
size_t index; // managed by ue2_graph
|
size_t index = 0; // managed by ue2_graph
|
||||||
u8 c = 0; //!< character reached on this vertex
|
u8 c = 0; //!< character reached on this vertex
|
||||||
flat_set<ReportID> reports; //!< managed reports fired on this vertex
|
flat_set<ReportID> reports; //!< managed reports fired on this vertex
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015, Intel Corporation
|
* Copyright (c) 2015-2022, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -57,6 +57,9 @@ struct hs_stream {
|
|||||||
|
|
||||||
/** \brief The current stream offset. */
|
/** \brief The current stream offset. */
|
||||||
u64a offset;
|
u64a offset;
|
||||||
|
|
||||||
|
/** \brief Identity of hs_stream, for scratch validity check. */
|
||||||
|
u32 crc32;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define getMultiState(hs_s) ((char *)(hs_s) + sizeof(*(hs_s)))
|
#define getMultiState(hs_s) ((char *)(hs_s) + sizeof(*(hs_s)))
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2017-2018, Intel Corporation
|
* Copyright (c) 2017-2022, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -116,6 +116,7 @@ size_t JOIN(sc_, FN_SUFFIX)(const struct RoseEngine *rose,
|
|||||||
= ((STREAM_QUAL char *)stream) + sizeof(struct hs_stream);
|
= ((STREAM_QUAL char *)stream) + sizeof(struct hs_stream);
|
||||||
|
|
||||||
COPY_FIELD(stream->offset);
|
COPY_FIELD(stream->offset);
|
||||||
|
COPY_FIELD(stream->crc32);
|
||||||
ASSIGN(stream->rose, rose);
|
ASSIGN(stream->rose, rose);
|
||||||
|
|
||||||
COPY(stream_body + ROSE_STATE_OFFSET_STATUS_FLAGS, 1);
|
COPY(stream_body + ROSE_STATE_OFFSET_STATUS_FLAGS, 1);
|
||||||
|
@ -76,7 +76,11 @@ public:
|
|||||||
|
|
||||||
T *allocate(std::size_t size) const {
|
T *allocate(std::size_t size) const {
|
||||||
size_t alloc_size = size * sizeof(T);
|
size_t alloc_size = size * sizeof(T);
|
||||||
return static_cast<T *>(aligned_malloc_internal(alloc_size, N));
|
T *ptr = static_cast<T *>(aligned_malloc_internal(alloc_size, N));
|
||||||
|
if (!ptr) {
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void deallocate(T *x, std::size_t) const noexcept {
|
void deallocate(T *x, std::size_t) const noexcept {
|
||||||
|
@ -70,8 +70,8 @@ class undirected_graph_edge_descriptor
|
|||||||
using base_vertex_type = typename base_graph_traits::vertex_descriptor;
|
using base_vertex_type = typename base_graph_traits::vertex_descriptor;
|
||||||
|
|
||||||
base_edge_type underlying_edge;
|
base_edge_type underlying_edge;
|
||||||
const base_graph_type *g;
|
const base_graph_type *g = nullptr;
|
||||||
bool reverse; // if true, reverse vertices in source() and target()
|
bool reverse = false; // if true, reverse vertices in source() and target()
|
||||||
|
|
||||||
inline std::pair<base_vertex_type, base_vertex_type>
|
inline std::pair<base_vertex_type, base_vertex_type>
|
||||||
canonical_edge() const {
|
canonical_edge() const {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2020, Intel Corporation
|
* Copyright (c) 2015-2021, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -156,6 +156,16 @@ static really_inline u32 movd(const m128 in) {
|
|||||||
return _mm_cvtsi128_si32(in);
|
return _mm_cvtsi128_si32(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static really_inline u64a movq(const m128 in) {
|
||||||
|
#if defined(ARCH_X86_64)
|
||||||
|
return _mm_cvtsi128_si64(in);
|
||||||
|
#else // 32-bit - this is horrific
|
||||||
|
u32 lo = movd(in);
|
||||||
|
u32 hi = movd(_mm_srli_epi64(in, 32));
|
||||||
|
return (u64a)hi << 32 | lo;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(HAVE_AVX512)
|
#if defined(HAVE_AVX512)
|
||||||
static really_inline u32 movd512(const m512 in) {
|
static really_inline u32 movd512(const m512 in) {
|
||||||
// NOTE: seems gcc doesn't support _mm512_cvtsi512_si32(in),
|
// NOTE: seems gcc doesn't support _mm512_cvtsi512_si32(in),
|
||||||
@ -166,20 +176,10 @@ static really_inline u32 movd512(const m512 in) {
|
|||||||
static really_inline u64a movq512(const m512 in) {
|
static really_inline u64a movq512(const m512 in) {
|
||||||
// NOTE: seems AVX512 doesn't support _mm512_cvtsi512_si64(in),
|
// NOTE: seems AVX512 doesn't support _mm512_cvtsi512_si64(in),
|
||||||
// so we use 2-step convertions to work around.
|
// so we use 2-step convertions to work around.
|
||||||
return _mm_cvtsi128_si64(_mm512_castsi512_si128(in));
|
return movq(_mm512_castsi512_si128(in));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static really_inline u64a movq(const m128 in) {
|
|
||||||
#if defined(ARCH_X86_64)
|
|
||||||
return _mm_cvtsi128_si64(in);
|
|
||||||
#else // 32-bit - this is horrific
|
|
||||||
u32 lo = movd(in);
|
|
||||||
u32 hi = movd(_mm_srli_epi64(in, 32));
|
|
||||||
return (u64a)hi << 32 | lo;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* another form of movq */
|
/* another form of movq */
|
||||||
static really_inline
|
static really_inline
|
||||||
m128 load_m128_from_u64a(const u64a *p) {
|
m128 load_m128_from_u64a(const u64a *p) {
|
||||||
@ -791,7 +791,7 @@ m128 movdq_lo(m256 x) {
|
|||||||
#define lshift128_m256(a, count_immed) _mm256_slli_si256(a, count_immed)
|
#define lshift128_m256(a, count_immed) _mm256_slli_si256(a, count_immed)
|
||||||
#define extract64from256(a, imm) _mm_extract_epi64(_mm256_extracti128_si256(a, imm >> 1), imm % 2)
|
#define extract64from256(a, imm) _mm_extract_epi64(_mm256_extracti128_si256(a, imm >> 1), imm % 2)
|
||||||
#define extract32from256(a, imm) _mm_extract_epi32(_mm256_extracti128_si256(a, imm >> 2), imm % 4)
|
#define extract32from256(a, imm) _mm_extract_epi32(_mm256_extracti128_si256(a, imm >> 2), imm % 4)
|
||||||
#define extractlow64from256(a) _mm_cvtsi128_si64(cast256to128(a))
|
#define extractlow64from256(a) movq(cast256to128(a))
|
||||||
#define extractlow32from256(a) movd(cast256to128(a))
|
#define extractlow32from256(a) movd(cast256to128(a))
|
||||||
#define interleave256hi(a, b) _mm256_unpackhi_epi8(a, b)
|
#define interleave256hi(a, b) _mm256_unpackhi_epi8(a, b)
|
||||||
#define interleave256lo(a, b) _mm256_unpacklo_epi8(a, b)
|
#define interleave256lo(a, b) _mm256_unpacklo_epi8(a, b)
|
||||||
|
@ -133,7 +133,7 @@ public:
|
|||||||
: lit(&lit_in), idx(idx_in) {}
|
: lit(&lit_in), idx(idx_in) {}
|
||||||
|
|
||||||
const ue2_literal *lit = nullptr;
|
const ue2_literal *lit = nullptr;
|
||||||
size_t idx;
|
size_t idx = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
|
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
|
||||||
|
@ -58,7 +58,10 @@ void readRow(sqlite3_stmt *statement, vector<DataBlock> &blocks,
|
|||||||
}
|
}
|
||||||
auto internal_stream_index = stream_indices[stream_id];
|
auto internal_stream_index = stream_indices[stream_id];
|
||||||
|
|
||||||
assert(blob || bytes > 0);
|
if (!(blob && bytes > 0)) {
|
||||||
|
assert(0);
|
||||||
|
throw std::domain_error("Invalid blob or bytes from sqlite3.");
|
||||||
|
}
|
||||||
blocks.emplace_back(id, stream_id, internal_stream_index,
|
blocks.emplace_back(id, stream_id, internal_stream_index,
|
||||||
string(blob, blob + bytes));
|
string(blob, blob + bytes));
|
||||||
}
|
}
|
||||||
|
@ -760,6 +760,11 @@ u64a byte_size(const vector<DataBlock> &corpus_blocks) {
|
|||||||
total += block.payload.size();
|
total += block.payload.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (total == 0) {
|
||||||
|
assert(0);
|
||||||
|
throw std::invalid_argument("Empty corpus.");
|
||||||
|
}
|
||||||
|
|
||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ public:
|
|||||||
std::lock_guard<std::mutex> lock(mutex);
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
if (failed) {
|
if (failed) {
|
||||||
// We have previously failed to compile this database.
|
// We have previously failed to compile this database.
|
||||||
return nullptr;
|
throw CompileFailed("Unable to compile db previously.");
|
||||||
}
|
}
|
||||||
if (db) {
|
if (db) {
|
||||||
return db;
|
return db;
|
||||||
|
@ -101,7 +101,7 @@ void NfaGeneratedCorpora::generate(unsigned id, vector<Corpus> &data) {
|
|||||||
pl.logicalKeyRenumber();
|
pl.logicalKeyRenumber();
|
||||||
const auto &m_lkey = pl.getLkeyMap();
|
const auto &m_lkey = pl.getLkeyMap();
|
||||||
assert(!m_lkey.empty());
|
assert(!m_lkey.empty());
|
||||||
u32 a_subid; // arbitrary sub id
|
u32 a_subid = 0; // arbitrary sub id
|
||||||
unordered_map<u32, vector<Corpus>> m_data;
|
unordered_map<u32, vector<Corpus>> m_data;
|
||||||
for (const auto &it : m_lkey) {
|
for (const auto &it : m_lkey) {
|
||||||
a_subid = it.first;
|
a_subid = it.first;
|
||||||
|
@ -98,6 +98,6 @@ void *Thread::runThread(void *thr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Thread::Thread(size_t num) : thread_id(num) {}
|
Thread::Thread(size_t num) : thread_id(num), thread() {}
|
||||||
|
|
||||||
Thread::~Thread() {}
|
Thread::~Thread() {}
|
||||||
|
@ -503,8 +503,8 @@ void processArgs(int argc, char *argv[], CorpusProperties &corpus_gen_prop,
|
|||||||
} else if (in_corpora) {
|
} else if (in_corpora) {
|
||||||
corpora->push_back(optarg);
|
corpora->push_back(optarg);
|
||||||
in_corpora = 2;
|
in_corpora = 2;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
|
|
||||||
#if defined(HAVE_SIGACTION) || defined(_WIN32)
|
#if defined(HAVE_SIGACTION) || defined(_WIN32)
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#define STACK_SIZE 8192 // linux kernel default stack size for x86
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_BACKTRACE
|
#ifdef HAVE_BACKTRACE
|
||||||
@ -175,7 +176,7 @@ void installSignalHandler(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_SIGALTSTACK
|
#ifdef HAVE_SIGALTSTACK
|
||||||
static TLS_VARIABLE char alt_stack_loc[SIGSTKSZ];
|
static TLS_VARIABLE char alt_stack_loc[STACK_SIZE];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void setSignalStack(void) {
|
void setSignalStack(void) {
|
||||||
@ -187,7 +188,7 @@ void setSignalStack(void) {
|
|||||||
stack_t alt_stack;
|
stack_t alt_stack;
|
||||||
memset(&alt_stack, 0, sizeof(alt_stack));
|
memset(&alt_stack, 0, sizeof(alt_stack));
|
||||||
alt_stack.ss_flags = 0;
|
alt_stack.ss_flags = 0;
|
||||||
alt_stack.ss_size = SIGSTKSZ;
|
alt_stack.ss_size = STACK_SIZE;
|
||||||
alt_stack.ss_sp = alt_stack_loc;
|
alt_stack.ss_sp = alt_stack_loc;
|
||||||
if (!sigaltstack(&alt_stack, nullptr)) {
|
if (!sigaltstack(&alt_stack, nullptr)) {
|
||||||
act.sa_flags |= SA_ONSTACK;
|
act.sa_flags |= SA_ONSTACK;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2016, Intel Corporation
|
* Copyright (c) 2015-2021, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -363,8 +363,9 @@ static const unsigned validModes[] = {
|
|||||||
// Mode bits for switching off various architecture features
|
// Mode bits for switching off various architecture features
|
||||||
static const unsigned long long featureMask[] = {
|
static const unsigned long long featureMask[] = {
|
||||||
~0ULL, /* native */
|
~0ULL, /* native */
|
||||||
~(HS_CPU_FEATURES_AVX2 | HS_CPU_FEATURES_AVX512), /* no avx2 */
|
~(HS_CPU_FEATURES_AVX2 | HS_CPU_FEATURES_AVX512 | HS_CPU_FEATURES_AVX512VBMI), /* no avx2 */
|
||||||
~HS_CPU_FEATURES_AVX512, /* no avx512 */
|
~(HS_CPU_FEATURES_AVX512 | HS_CPU_FEATURES_AVX512VBMI), /* no avx512 */
|
||||||
|
~HS_CPU_FEATURES_AVX512VBMI, /* no avx512vbmi */
|
||||||
};
|
};
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(Single,
|
INSTANTIATE_TEST_CASE_P(Single,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2017, Intel Corporation
|
* Copyright (c) 2015-2021, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -56,6 +56,10 @@ TEST(DB, flagsToPlatform) {
|
|||||||
p.cpu_features |= HS_CPU_FEATURES_AVX512;
|
p.cpu_features |= HS_CPU_FEATURES_AVX512;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_AVX512VBMI)
|
||||||
|
p.cpu_features |= HS_CPU_FEATURES_AVX512VBMI;
|
||||||
|
#endif
|
||||||
|
|
||||||
platform_t pp = target_to_platform(target_t(p));
|
platform_t pp = target_to_platform(target_t(p));
|
||||||
ASSERT_EQ(pp, hs_current_platform);
|
ASSERT_EQ(pp, hs_current_platform);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2017, Intel Corporation
|
* Copyright (c) 2015-2022, Intel Corporation
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -64,8 +64,8 @@ static ValidUtf8TestInfo valid_utf8_tests[] = {
|
|||||||
{"공동경비구역", true},
|
{"공동경비구역", true},
|
||||||
{"জলসাঘর", true},
|
{"জলসাঘর", true},
|
||||||
|
|
||||||
// Invalid one-byte caseS.
|
// Valid one-byte caseS.
|
||||||
{"\x7f", false},
|
{"\x7f", true}, // \x7f is valid
|
||||||
|
|
||||||
// These bytes should never appear in a UTF-8 stream.
|
// These bytes should never appear in a UTF-8 stream.
|
||||||
{"\xc0", false},
|
{"\xc0", false},
|
||||||
|
@ -268,12 +268,12 @@ void CorpusEditorUtf8::flip_case(vector<unichar> &corpus) {
|
|||||||
unichar CorpusEditorUtf8::chooseCodePoint(void) {
|
unichar CorpusEditorUtf8::chooseCodePoint(void) {
|
||||||
/* We need to ensure that we don't pick a surrogate cp */
|
/* We need to ensure that we don't pick a surrogate cp */
|
||||||
const u32 range =
|
const u32 range =
|
||||||
MAX_UNICODE + 1 - (UNICODE_SURROGATE_MAX + UNICODE_SURROGATE_MIN + 1);
|
MAX_UNICODE + 1 - (UNICODE_SURROGATE_MAX - UNICODE_SURROGATE_MIN + 1);
|
||||||
unichar raw = props.rand(0, range - 1);
|
unichar raw = props.rand(0, range - 1);
|
||||||
if (raw < UNICODE_SURROGATE_MIN) {
|
if (raw < UNICODE_SURROGATE_MIN) {
|
||||||
return raw;
|
return raw;
|
||||||
} else {
|
} else {
|
||||||
return raw + UNICODE_SURROGATE_MAX + 1;
|
return raw + UNICODE_SURROGATE_MAX - UNICODE_SURROGATE_MIN + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,14 +477,14 @@ void CorpusGeneratorUtf8::generateCorpus(vector<string> &data) {
|
|||||||
* that we've been asked for. */
|
* that we've been asked for. */
|
||||||
unichar CorpusGeneratorUtf8::getRandomChar() {
|
unichar CorpusGeneratorUtf8::getRandomChar() {
|
||||||
u32 range = MAX_UNICODE + 1
|
u32 range = MAX_UNICODE + 1
|
||||||
- (UNICODE_SURROGATE_MAX + UNICODE_SURROGATE_MIN + 1);
|
- (UNICODE_SURROGATE_MAX - UNICODE_SURROGATE_MIN + 1);
|
||||||
range = min(cProps.alphabetSize, range);
|
range = min(cProps.alphabetSize, range);
|
||||||
assert(range);
|
assert(range);
|
||||||
|
|
||||||
unichar c = 'a' + cProps.rand(0, range - 1);
|
unichar c = 'a' + cProps.rand(0, range - 1);
|
||||||
|
|
||||||
if (c >= UNICODE_SURROGATE_MIN) {
|
if (c >= UNICODE_SURROGATE_MIN) {
|
||||||
c =+ UNICODE_SURROGATE_MAX + 1;
|
c += UNICODE_SURROGATE_MAX - UNICODE_SURROGATE_MIN + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return c % (MAX_UNICODE + 1);
|
return c % (MAX_UNICODE + 1);
|
||||||
|
@ -42,7 +42,7 @@ CorpusProperties::CorpusProperties()
|
|||||||
: matchness(100), unmatchness(0), randomness(0), prefixRange(0, 0),
|
: matchness(100), unmatchness(0), randomness(0), prefixRange(0, 0),
|
||||||
suffixRange(0, 0), cycleMin(1), cycleMax(1),
|
suffixRange(0, 0), cycleMin(1), cycleMax(1),
|
||||||
corpusLimit(DEFAULT_CORPUS_GENERATOR_LIMIT), editDistance(0),
|
corpusLimit(DEFAULT_CORPUS_GENERATOR_LIMIT), editDistance(0),
|
||||||
alphabetSize(~0) {
|
alphabetSize(~0), rngSeed(0) {
|
||||||
// empty
|
// empty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user