Fix: add meta size in code count (#5054)
This commit is contained in:
parent
c5275fe1b3
commit
3e99cde149
5 changed files with 85 additions and 15 deletions
|
|
@ -5574,13 +5574,15 @@ RZ_API bool rz_core_analysis_continue_until_call(RZ_NONNULL RzCore *core) {
|
|||
|
||||
/**
|
||||
* \brief Compute analysis coverage count
|
||||
* \param core The RzCore instance
|
||||
* \return Total size of coverage. SIZE_MAX on failure.
|
||||
*/
|
||||
RZ_API st64 rz_core_analysis_coverage_count(RZ_NONNULL RzCore *core) {
|
||||
rz_return_val_if_fail(core && core->analysis, ST64_MAX);
|
||||
RZ_API size_t rz_core_analysis_coverage_count(RZ_NONNULL RzCore *core) {
|
||||
rz_return_val_if_fail(core && core->analysis, SIZE_MAX);
|
||||
RzListIter *iter;
|
||||
RzAnalysisFunction *fcn;
|
||||
st64 cov = 0;
|
||||
cov += (st64)rz_meta_get_size(core->analysis, RZ_META_TYPE_DATA);
|
||||
size_t cov = 0;
|
||||
cov += (size_t)rz_meta_get_size(core->analysis, RZ_META_TYPE_DATA);
|
||||
rz_list_foreach (core->analysis->fcns, iter, fcn) {
|
||||
void **it;
|
||||
RzPVector *maps = rz_io_maps(core->io);
|
||||
|
|
@ -5590,7 +5592,7 @@ RZ_API st64 rz_core_analysis_coverage_count(RZ_NONNULL RzCore *core) {
|
|||
ut64 section_end = map->itv.addr + map->itv.size;
|
||||
ut64 s = rz_analysis_function_realsize(fcn);
|
||||
if (fcn->addr >= map->itv.addr && (fcn->addr + s) < section_end) {
|
||||
cov += (st64)s;
|
||||
cov += (size_t)s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -5600,16 +5602,19 @@ RZ_API st64 rz_core_analysis_coverage_count(RZ_NONNULL RzCore *core) {
|
|||
|
||||
/**
|
||||
* \brief Compute analysis code count
|
||||
* \param core The RzCore instance
|
||||
* \return Total size of code regions. SIZE_MAX on failure.
|
||||
*/
|
||||
RZ_API st64 rz_core_analysis_code_count(RZ_NONNULL RzCore *core) {
|
||||
rz_return_val_if_fail(core, ST64_MAX);
|
||||
st64 code = 0;
|
||||
RZ_API size_t rz_core_analysis_code_count(RZ_NONNULL RzCore *core) {
|
||||
rz_return_val_if_fail(core, SIZE_MAX);
|
||||
size_t code = 0;
|
||||
code += (size_t)rz_meta_get_size(core->analysis, RZ_META_TYPE_DATA);
|
||||
void **it;
|
||||
RzPVector *maps = rz_io_maps(core->io);
|
||||
rz_pvector_foreach (maps, it) {
|
||||
RzIOMap *map = *it;
|
||||
if (map->perm & RZ_PERM_X) {
|
||||
code += (st64)map->itv.size;
|
||||
code += (size_t)map->itv.size;
|
||||
}
|
||||
}
|
||||
return code;
|
||||
|
|
@ -5617,12 +5622,14 @@ RZ_API st64 rz_core_analysis_code_count(RZ_NONNULL RzCore *core) {
|
|||
|
||||
/**
|
||||
* \brief Compute analysis function xrefs count
|
||||
* \param core The RzCore instance
|
||||
* \return Total calls from all functions. SIZE_MAX on failure.
|
||||
*/
|
||||
RZ_API st64 rz_core_analysis_calls_count(RZ_NONNULL RzCore *core) {
|
||||
rz_return_val_if_fail(core && core->analysis, ST64_MAX);
|
||||
RZ_API size_t rz_core_analysis_calls_count(RZ_NONNULL RzCore *core) {
|
||||
rz_return_val_if_fail(core && core->analysis, SIZE_MAX);
|
||||
RzListIter *iter;
|
||||
RzAnalysisFunction *fcn;
|
||||
st64 cov = 0;
|
||||
size_t cov = 0;
|
||||
rz_list_foreach (core->analysis->fcns, iter, fcn) {
|
||||
RzList *xrefs = rz_analysis_function_get_xrefs_from(fcn);
|
||||
if (xrefs) {
|
||||
|
|
|
|||
|
|
@ -741,9 +741,9 @@ RZ_API bool rz_core_analysis_continue_until_call(RZ_NONNULL RzCore *core);
|
|||
RZ_API bool rz_core_is_debugging(RZ_NONNULL RzCore *core);
|
||||
RZ_API void rz_core_perform_auto_analysis(RZ_NONNULL RzCore *core, RzCoreAnalysisType type);
|
||||
|
||||
RZ_API st64 rz_core_analysis_coverage_count(RZ_NONNULL RzCore *core);
|
||||
RZ_API st64 rz_core_analysis_code_count(RZ_NONNULL RzCore *core);
|
||||
RZ_API st64 rz_core_analysis_calls_count(RZ_NONNULL RzCore *core);
|
||||
RZ_API size_t rz_core_analysis_coverage_count(RZ_NONNULL RzCore *core);
|
||||
RZ_API size_t rz_core_analysis_code_count(RZ_NONNULL RzCore *core);
|
||||
RZ_API size_t rz_core_analysis_calls_count(RZ_NONNULL RzCore *core);
|
||||
|
||||
RZ_API RZ_BORROW const char *rz_core_analysis_name_type_to_str(RzCoreAnalysisNameType typ);
|
||||
RZ_API void rz_core_analysis_name_free(RZ_NULLABLE RzCoreAnalysisName *p);
|
||||
|
|
|
|||
19
test/db/cmd/cmd_coverage
Normal file
19
test/db/cmd/cmd_coverage
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
NAME=analysis coverage_test
|
||||
FILE=bins/elf/demangle-test-cpp
|
||||
CMDS=<<EOF
|
||||
aaaa
|
||||
aai
|
||||
EOF
|
||||
EXPECT=<<EOF
|
||||
functions: 76
|
||||
xrefs: 179
|
||||
calls: 130
|
||||
strings: 1
|
||||
symbols: 102
|
||||
imports: 10
|
||||
signatures: 0
|
||||
coverage: 4816
|
||||
code size: 5205
|
||||
percentage: 92.53% (coverage on code size)
|
||||
EOF
|
||||
RUN
|
||||
|
|
@ -15,6 +15,7 @@ if get_option('enable_tests')
|
|||
'analysis_block',
|
||||
'analysis_cc',
|
||||
'analysis_class_graph',
|
||||
'analysis_coverage',
|
||||
'analysis_function',
|
||||
'analysis_hints',
|
||||
'analysis_meta',
|
||||
|
|
|
|||
43
test/unit/test_analysis_coverage.c
Normal file
43
test/unit/test_analysis_coverage.c
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
// SPDX-FileCopyrightText: 2025 PremadeS <emadsohail001@gmail.com>
|
||||
// SPDX-License-Identifier: LGPL-3.0-only
|
||||
#include <rz_analysis.h>
|
||||
#include <rz_core.h>
|
||||
#include <rz_io.h>
|
||||
|
||||
#include "minunit.h"
|
||||
|
||||
bool test_code_size_vs_coverage(void) {
|
||||
|
||||
RzCore *r = rz_core_new();
|
||||
bool io_open1 = rz_io_open(r->io, "malloc://0x100", RZ_PERM_R, 0);
|
||||
bool io_open2 = rz_io_open(r->io, "malloc://0x50", RZ_PERM_X | RZ_PERM_RW, 0);
|
||||
mu_assert("Failed to open executable memory region", io_open1);
|
||||
mu_assert("Failed to open read-only memory region", io_open2);
|
||||
|
||||
ut8 codes[] = { 0x90, 0x90, 0x90, 0xC3 }; // NOP NOP NOP RET (simple function)
|
||||
bool written = rz_io_write_at(r->io, 0x10, codes, sizeof(codes));
|
||||
mu_assert("Failed to write instructions to memory", written);
|
||||
|
||||
bool meta_set = rz_meta_set(r->analysis, RZ_META_TYPE_DATA, 0x10, 0x60, "some random data");
|
||||
mu_assert("Failed to set metadata", meta_set);
|
||||
|
||||
rz_core_analysis_all(r);
|
||||
|
||||
long long int code = rz_core_analysis_code_count(r);
|
||||
mu_assert("Code size should be non-negative", code >= 0);
|
||||
|
||||
long long int cov = rz_core_analysis_coverage_count(r);
|
||||
mu_assert("Coverage should be non-negative", cov >= 0);
|
||||
|
||||
mu_assert("Coverage exceeded code size", cov <= code);
|
||||
|
||||
rz_core_free(r);
|
||||
mu_end;
|
||||
}
|
||||
|
||||
bool all_tests(void) {
|
||||
mu_run_test(test_code_size_vs_coverage);
|
||||
return tests_passed != tests_run;
|
||||
}
|
||||
|
||||
mu_main(all_tests);
|
||||
Loading…
Reference in a new issue