summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2024-01-28 20:07:24 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2024-01-28 20:07:24 (GMT)
commit3231349bac6aae1f236416a8a51f41caccc38961 (patch)
treeeb3893589a6d354198afd2e60c04f04093f165ec /src/analysis
parente5abd7f0ddecbccf58eeb34207c5a623b24e1557 (diff)
Update the current scan backend warm-up.
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/scan/patterns/backend-int.h2
-rw-r--r--src/analysis/scan/patterns/backend.c11
-rw-r--r--src/analysis/scan/patterns/backend.h2
-rw-r--r--src/analysis/scan/patterns/backends/acism.c35
-rw-r--r--src/analysis/scan/scanner.c13
5 files changed, 40 insertions, 23 deletions
diff --git a/src/analysis/scan/patterns/backend-int.h b/src/analysis/scan/patterns/backend-int.h
index 90daec9..aeabe1b 100644
--- a/src/analysis/scan/patterns/backend-int.h
+++ b/src/analysis/scan/patterns/backend-int.h
@@ -36,7 +36,7 @@ typedef size_t (* get_backend_atom_max_size_fc) (const GEngineBackend *);
typedef patid_t (* enroll_plain_into_backend_fc) (GEngineBackend *, const uint8_t *, size_t, uint32_t [2]);
/* Met en ordre les derniers détails avant un premier scan. */
-typedef void (* warm_up_backend_fc) (GEngineBackend *);
+typedef bool (* warm_up_backend_fc) (GEngineBackend *);
/* Récupère les identifiants finaux pour un motif recherché. */
typedef patid_t (* build_backend_plain_pattern_id_fc) (const GEngineBackend *, const uint32_t [2]);
diff --git a/src/analysis/scan/patterns/backend.c b/src/analysis/scan/patterns/backend.c
index 50cc889..a887600 100644
--- a/src/analysis/scan/patterns/backend.c
+++ b/src/analysis/scan/patterns/backend.c
@@ -187,20 +187,25 @@ bool g_engine_backend_enroll_plain_pattern(GEngineBackend *backend, const uint8_
* *
* Description : Met en ordre les derniers détails avant un premier scan. *
* *
-* Retour : - *
+* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
-void g_engine_backend_warm_up(GEngineBackend *backend)
+bool g_engine_backend_warm_up(GEngineBackend *backend)
{
+ bool result; /* Bilan à retourner */
GEngineBackendClass *class; /* Classe à activer */
class = G_ENGINE_BACKEND_GET_CLASS(backend);
if (class->warm_up != NULL)
- class->warm_up(backend);
+ result = class->warm_up(backend);
+ else
+ result = true;
+
+ return result;
}
diff --git a/src/analysis/scan/patterns/backend.h b/src/analysis/scan/patterns/backend.h
index 71c97d1..3f9be03 100644
--- a/src/analysis/scan/patterns/backend.h
+++ b/src/analysis/scan/patterns/backend.h
@@ -60,7 +60,7 @@ size_t g_engine_backend_get_atom_max_size(const GEngineBackend *);
bool g_engine_backend_enroll_plain_pattern(GEngineBackend *, const uint8_t *, size_t, uint32_t [2]);
/* Met en ordre les derniers détails avant un premier scan. */
-void g_engine_backend_warm_up(GEngineBackend *);
+bool g_engine_backend_warm_up(GEngineBackend *);
/* Récupère les identifiants finaux pour un motif recherché. */
patid_t g_engine_backend_build_plain_pattern_id(const GEngineBackend *, const uint32_t [2]);
diff --git a/src/analysis/scan/patterns/backends/acism.c b/src/analysis/scan/patterns/backends/acism.c
index a36e4b7..d517168 100644
--- a/src/analysis/scan/patterns/backends/acism.c
+++ b/src/analysis/scan/patterns/backends/acism.c
@@ -37,10 +37,10 @@
/* ---------------------- IMPLANTATION D'UNE NOUVELLE APPROCHE ---------------------- */
-/* Initialise la classe des méthodes basée sur Bitmap. */
+/* Initialise la classe des méthodes basée sur ACISM. */
static void g_acism_backend_class_init(GAcismBackendClass *);
-/* Initialise une instance de méthodes basée sur Bitmap. */
+/* Initialise une instance de méthodes basée sur ACISM. */
static void g_acism_backend_init(GAcismBackend *);
/* Supprime toutes les références externes. */
@@ -92,15 +92,15 @@ static void g_acism_backend_prepare_interleave_array(GAcismBackend *);
/* Compresse l'arborescence dans un tableau de position. */
static void g_acism_backend_build_interleave_array(GAcismBackend *);
-/* Détermine le nombre d'identifiants constitués. */
-static size_t g_acism_backend_count_plain_pattern_ids(const GAcismBackend *);
-
/* Met en ordre les derniers détails avant un premier scan. */
-static void g_acism_backend_warm_up(GAcismBackend *);
+static bool g_acism_backend_warm_up(GAcismBackend *);
/* Récupère les identifiants finaux pour un motif recherché. */
static patid_t g_acism_backend_build_plain_pattern_id(const GAcismBackend *, const uint32_t [2]);
+/* Détermine le nombre d'identifiants constitués. */
+static size_t g_acism_backend_count_plain_pattern_ids(const GAcismBackend *);
+
/* Parcours un contenu binaire à la recherche de motifs. */
static void g_acism_backend_run_scan(const GAcismBackend *, GScanContext *);
@@ -125,7 +125,7 @@ G_DEFINE_TYPE(GAcismBackend, g_acism_backend, G_TYPE_ENGINE_BACKEND);
* *
* Paramètres : klass = classe à initialiser. *
* *
-* Description : Initialise la classe des méthodes basée sur Bitmap. *
+* Description : Initialise la classe des méthodes basée sur ACISM. *
* *
* Retour : - *
* *
@@ -160,7 +160,7 @@ static void g_acism_backend_class_init(GAcismBackendClass *klass)
* *
* Paramètres : backend = instance à initialiser. *
* *
-* Description : Initialise une instance de méthodes basée sur Bitmap. *
+* Description : Initialise une instance de méthodes basée sur ACISM. *
* *
* Retour : - *
* *
@@ -1121,14 +1121,18 @@ static void g_acism_backend_build_interleave_array(GAcismBackend *backend)
* *
* Description : Met en ordre les derniers détails avant un premier scan. *
* *
-* Retour : - *
+* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
-static void g_acism_backend_warm_up(GAcismBackend *backend)
+static bool g_acism_backend_warm_up(GAcismBackend *backend)
{
+ bool result; /* Bilan à retourner */
+
+ result = true;
+
#ifdef __USE_BYTE_FREQ
/**
@@ -1163,6 +1167,8 @@ static void g_acism_backend_warm_up(GAcismBackend *backend)
g_acism_backend_build_interleave_array(backend);
+ return result;
+
}
@@ -1184,6 +1190,8 @@ static patid_t g_acism_backend_build_plain_pattern_id(const GAcismBackend *backe
patid_t result; /* Identifiant à retourner */
acism_source_t *source; /* Motif d'origine concerné */
+ assert(tmp_id[0] < backend->sources_count);
+
source = backend->sources + tmp_id[0];
result = source->coverage[SOURCE_COVERAGE_START] + tmp_id[1];
@@ -1211,7 +1219,10 @@ static size_t g_acism_backend_count_plain_pattern_ids(const GAcismBackend *backe
{
size_t result; /* Quantité à retourner */
- result = backend->sources[backend->sources_count -1].coverage[SOURCE_COVERAGE_END];
+ if (backend->sources_count == 0)
+ result = 0;
+ else
+ result = backend->sources[backend->sources_count - 1].coverage[SOURCE_COVERAGE_END];
return result;
@@ -1248,8 +1259,8 @@ static void g_acism_backend_run_scan(const GAcismBackend *backend, GScanContext
acism_code_t code; /* Code du caractère courant */
unsigned int next; /* Prochaine tête à valider */
acism_state_t next_state; /* Prochaine tête à valider */
- uint32_t final_k; /* Dernier indice à traiter */
uint32_t k; /* Boucle de parcours #2 */
+ uint32_t final_k; /* Dernier indice à traiter */
unsigned int iter; /* Boucle de parcours #3 */
acism_state_t test_state; /* Test de validité alternative*/
acism_state_t sub_state; /* Test de validité alternative*/
diff --git a/src/analysis/scan/scanner.c b/src/analysis/scan/scanner.c
index 507fa6f..f320f93 100644
--- a/src/analysis/scan/scanner.c
+++ b/src/analysis/scan/scanner.c
@@ -493,7 +493,7 @@ GScanContext *g_content_scanner_analyze(GContentScanner *scanner, GScanOptions *
GScanRule *rule; /* Règle à consulter */
const char *name; /* Désignation de la règle */
-#if 0
+#if 0 // FIXME
int policy;
struct sched_param sp;
@@ -539,17 +539,18 @@ GScanContext *g_content_scanner_analyze(GContentScanner *scanner, GScanOptions *
for (i = 0; i < scanner->rule_count && status; i++)
status = g_scan_rule_setup_backend(scanner->rules[i], scanner->data_backend, result);
+ if (status)
+ status = g_engine_backend_warm_up(scanner->data_backend);
+
+ for (i = 0; i < scanner->rule_count && status; i++)
+ status = g_scan_rule_define_pattern_ids(scanner->rules[i], scanner->data_backend);
+
if (!status)
{
g_clear_object(&result);
goto exit;
}
- g_engine_backend_warm_up(scanner->data_backend);
-
- for (i = 0; i < scanner->rule_count && status; i++)
- status = g_scan_rule_define_pattern_ids(scanner->rules[i], scanner->data_backend);
-
/* Affichage éventuel de statistiques */
if (g_scan_options_get_print_stats(options))