diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index 6f8290a51..332ba4289 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -1,17 +1,17 @@ file(GLOB_RECURSE LIBDDWAF_BENCHMARK_SOURCE *.cpp) -add_executable(benchmark ${LIBDDWAF_BENCHMARK_SOURCE}) -target_compile_options(benchmark PRIVATE $<$:-flto>) -target_link_libraries(benchmark PRIVATE libddwaf_objects lib_yamlcpp lib_rapidjson m) -target_include_directories(benchmark PRIVATE ${libddwaf_SOURCE_DIR}/src) +add_executable(waf_benchmark ${LIBDDWAF_BENCHMARK_SOURCE}) +target_compile_options(waf_benchmark PRIVATE $<$:-flto>) +target_link_libraries(waf_benchmark PRIVATE libddwaf_objects lib_yamlcpp lib_rapidjson m) +target_include_directories(waf_benchmark PRIVATE ${libddwaf_SOURCE_DIR}/src) -set_target_properties(benchmark PROPERTIES +set_target_properties(waf_benchmark PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED YES CXX_EXTENSIONS NO) add_custom_target(run_benchmark - COMMAND $ + COMMAND $ --scenarios=${CMAKE_CURRENT_SOURCE_DIR}/scenarios --iterations=1000 --format=json @@ -19,4 +19,4 @@ add_custom_target(run_benchmark --fixtures="random" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) -add_dependencies(run_benchmark benchmark) +add_dependencies(run_benchmark waf_benchmark) diff --git a/benchmark/main.cpp b/benchmark/main.cpp index a94caeae4..56f92ba65 100644 --- a/benchmark/main.cpp +++ b/benchmark/main.cpp @@ -82,6 +82,7 @@ benchmark::settings generate_settings(const std::vector &args) } else { s.scenarios.emplace_back(root); } + std::sort(s.scenarios.begin(), s.scenarios.end()); } if (opts.contains("format")) { diff --git a/tools/simplify_ruleset.cpp b/tools/simplify_ruleset.cpp new file mode 100644 index 000000000..fc08023db --- /dev/null +++ b/tools/simplify_ruleset.cpp @@ -0,0 +1,101 @@ +// Unless explicitly stated otherwise all files in this repository are +// dual-licensed under the Apache-2.0 License or BSD-3-Clause License. +// +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2021 Datadog, Inc. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common/utils.hpp" + +std::optional simplify_regex(const std::string &str) { + re2::RE2 regex(str); + + auto *regexp = regex.Regexp(); + auto simplified = regexp->ToString(); + if (simplified != str) { + return simplified; + } + + return std::nullopt; +} + +void simplify_condition(auto &condition, auto &allocator) +{ + std::string_view op = condition["operator"].GetString(); + if (op != "match_regex") { + return; + } + + auto ¶meters = condition["parameters"]; + auto ®ex = parameters["regex"]; + std::string regex_str = regex.GetString(); + + auto simplified_regex = simplify_regex(regex_str); + if (simplified_regex.has_value()) { + regex.SetString(simplified_regex.value(), allocator); + } +} + +int main(int argc, char *argv[]) +{ + int retval = EXIT_SUCCESS; + + if (argc < 2) { + std::cout << "Usage: " << argv[0] << " \n"; + return EXIT_FAILURE; + } + + rapidjson::Document doc; + doc.Parse(read_file(argv[1])); + + auto &alloc = doc.GetAllocator(); + + if (doc.HasMember("rules")) { + auto &rules = doc["rules"]; + for (auto &rule : rules.GetArray()) { + auto &conditions = rule["conditions"]; + for (auto &condition : conditions.GetArray()) { + simplify_condition(condition, alloc); + } + } + } + + if (doc.HasMember("scanners")) { + auto &scanners = doc["scanners"]; + for (auto &scanner : scanners.GetArray()) { + auto value_it = scanner.FindMember("value"); + if (value_it != scanner.MemberEnd()) { + auto &value = value_it->value; + simplify_condition(value, alloc); + } + + auto key_it = scanner.FindMember("key"); + if (key_it != scanner.MemberEnd()) { + auto &key = key_it->value; + simplify_condition(key, alloc); + } + } + } + + rapidjson::StringBuffer buffer; + buffer.Clear(); + + rapidjson::PrettyWriter writer(buffer); + writer.SetIndent(' ', 2); + doc.Accept(writer); + + std::cout << buffer.GetString(); + + return retval; +}