From b170dac195523d8581af29ade7702813abece281 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Fri, 18 Apr 2025 06:52:21 +0200 Subject: [PATCH] Fix warnings --- ..._wrapper2.hpp => function_wrapper_tcg.hpp} | 36 ++++++++++--------- .../unicorn-emulator/unicorn_x64_emulator.cpp | 20 +++++------ 2 files changed, 29 insertions(+), 27 deletions(-) rename src/backends/unicorn-emulator/{function_wrapper2.hpp => function_wrapper_tcg.hpp} (56%) diff --git a/src/backends/unicorn-emulator/function_wrapper2.hpp b/src/backends/unicorn-emulator/function_wrapper_tcg.hpp similarity index 56% rename from src/backends/unicorn-emulator/function_wrapper2.hpp rename to src/backends/unicorn-emulator/function_wrapper_tcg.hpp index e7471580..4cdaed8a 100644 --- a/src/backends/unicorn-emulator/function_wrapper2.hpp +++ b/src/backends/unicorn-emulator/function_wrapper_tcg.hpp @@ -1,55 +1,57 @@ #pragma once +#include #include #include #include -template -T resolve_indexed_argument_internal(size_t* args, size_t& index) +template +T resolve_indexed_argument_internal(const std::array& args, size_t& index) { const auto a1 = args[index++]; if constexpr (sizeof(T) <= sizeof(a1) || sizeof(size_t) > 4) { - return (T)(a1); + return T(a1); } else { const auto a2 = args[index++]; const auto arg = (a1 | (static_cast(a2) << 32)); - return (T)(arg); + return T(arg); } } -template -T resolve_indexed_argument(size_t* args, size_t& index) +template +T resolve_indexed_argument(const std::array& args, size_t& index) { - auto arg = resolve_indexed_argument_internal(args, index); + auto arg = resolve_indexed_argument_internal(args, index); return arg; } template -class function_wrapper2 : public utils::object +class function_wrapper_tcg : public utils::object { public: using user_data_pointer = void*; using c_function_type = ReturnType(Args..., user_data_pointer); using functor_type = std::function; - function_wrapper2() = default; + function_wrapper_tcg() = default; - function_wrapper2(functor_type functor) + function_wrapper_tcg(functor_type functor) : functor_(std::make_unique(std::move(functor))) { } c_function_type* get_c_function() const { - return (c_function_type*)(void*)+[](size_t a1, size_t a2, size_t a3, size_t a4, size_t a5, size_t a6, size_t a7, - size_t a8, size_t a9, size_t a10, size_t a11, size_t a12) -> uint64_t { - size_t real_args[]{a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12}; + auto* func = +[](const size_t a1, const size_t a2, const size_t a3, const size_t a4, const size_t a5, + const size_t a6, const size_t a7, const size_t a8, const size_t a9, const size_t a10, + const size_t a11, const size_t a12) -> uint64_t { + const std::array arguments = {a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12}; const auto lambda = +[](Args... args, user_data_pointer user_data) -> ReturnType { return (*static_cast(user_data))(std::forward(args)...); @@ -57,19 +59,21 @@ class function_wrapper2 : public utils::object size_t index = 0; std::tuple func_args{ - resolve_indexed_argument>>(real_args, index)..., - resolve_indexed_argument(real_args, index)}; + resolve_indexed_argument>>(arguments, index)..., + resolve_indexed_argument(arguments, index)}; (void)index; if constexpr (!std::is_void_v) { - return (uint64_t)std::apply(lambda, std::move(func_args)); + return uint64_t(std::apply(lambda, std::move(func_args))); } std::apply(lambda, std::move(func_args)); return 0; }; + + return reinterpret_cast(reinterpret_cast(func)); } void* get_function() const diff --git a/src/backends/unicorn-emulator/unicorn_x64_emulator.cpp b/src/backends/unicorn-emulator/unicorn_x64_emulator.cpp index 97cd07c3..5be03b90 100644 --- a/src/backends/unicorn-emulator/unicorn_x64_emulator.cpp +++ b/src/backends/unicorn-emulator/unicorn_x64_emulator.cpp @@ -7,7 +7,7 @@ #include "unicorn_hook.hpp" #include "function_wrapper.hpp" -#include "function_wrapper2.hpp" +#include "function_wrapper_tcg.hpp" #include namespace unicorn @@ -386,7 +386,6 @@ namespace unicorn emulator_hook* hook_instruction(const int instruction_type, instruction_hook_callback callback) override { - unicorn_hook hook{*this}; auto container = std::make_unique(); @@ -400,19 +399,18 @@ namespace unicorn uce(uc_hook_add(*this, hook.make_reference(), UC_HOOK_INSN_INVALID, wrapper.get_function(), wrapper.get_user_data(), 0, std::numeric_limits::max())); - container->add(std::move(wrapper), std::move(hook)); - } - else if(inst_type == x64_hookable_instructions::syscall){ - function_wrapper wrapper([c = std::move(callback)](uc_engine*) { - c(); - }); + container->add(std::move(wrapper), std::move(hook)); + } + else if (inst_type == x64_hookable_instructions::syscall) + { + function_wrapper wrapper([c = std::move(callback)](uc_engine*) { c(); }); const auto uc_instruction = map_hookable_instruction(inst_type); uce(uc_hook_add(*this, hook.make_reference(), UC_HOOK_INSN, wrapper.get_function(), wrapper.get_user_data(), 0, std::numeric_limits::max(), uc_instruction)); - container->add(std::move(wrapper), std::move(hook)); + container->add(std::move(wrapper), std::move(hook)); } else { @@ -425,7 +423,7 @@ namespace unicorn wrapper.get_user_data(), 0, std::numeric_limits::max(), uc_instruction)); - container->add(std::move(wrapper), std::move(hook)); + container->add(std::move(wrapper), std::move(hook)); } auto* result = container->as_opaque_hook(); @@ -552,7 +550,7 @@ namespace unicorn c(address); // }; - function_wrapper2 wrapper(std::move(exec_wrapper)); + function_wrapper_tcg wrapper(std::move(exec_wrapper)); unicorn_hook hook{*this};