Fix: add meta size in code count (#5054)

This commit is contained in:
Premade 2025-04-02 07:54:52 +05:00 committed by GitHub
parent c5275fe1b3
commit 3e99cde149
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 85 additions and 15 deletions

View file

@ -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) {

View file

@ -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
View 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

View file

@ -15,6 +15,7 @@ if get_option('enable_tests')
'analysis_block',
'analysis_cc',
'analysis_class_graph',
'analysis_coverage',
'analysis_function',
'analysis_hints',
'analysis_meta',

View 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);