From c8100ec06fe472b656e6313db0ae66b32fc69044 Mon Sep 17 00:00:00 2001 From: Christophe Grenier Date: Sat, 13 Mar 2021 16:37:53 +0100 Subject: [PATCH] src/file_vmg.c: add Frama-C annotations --- src/file_vmg.c | 58 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/src/file_vmg.c b/src/file_vmg.c index 4d17693c..544a39f1 100644 --- a/src/file_vmg.c +++ b/src/file_vmg.c @@ -31,43 +31,63 @@ #include "types.h" #include "filegen.h" +/*@ requires \valid(file_stat); */ static void register_header_check_vmg(file_stat_t *file_stat); -const file_hint_t file_hint_vmg= { - .extension="vmg", - .description="Nokia Text Message", - .max_filesize=PHOTOREC_MAX_FILE_SIZE, - .recover=1, - .enable_by_default=1, - .register_header_check=®ister_header_check_vmg +const file_hint_t file_hint_vmg = { + .extension = "vmg", + .description = "Nokia Text Message", + .max_filesize = PHOTOREC_MAX_FILE_SIZE, + .recover = 1, + .enable_by_default = 1, + .register_header_check = ®ister_header_check_vmg }; +/*@ + @ requires \valid(file_recovery); + @ requires valid_file_recovery(file_recovery); + @ requires \separated(file_recovery, file_recovery->handle, file_recovery->extension, &errno, &Frama_C_entropy_source); + @ requires file_recovery->file_check == &file_check_vmg; + @ ensures \valid(file_recovery->handle); + @ assigns *file_recovery->handle, errno, file_recovery->file_size; + @ assigns Frama_C_entropy_source; + @*/ static void file_check_vmg(file_recovery_t *file_recovery) { - const unsigned char vmg_footer[0x15]= { - 0x00, '\n', 0x00, 'E' , 0x00, 'N' , 0x00, 'D' , - 0x00, ':' , 0x00, 'V' , 0x00, 'M' , 0x00, 'S' , - 0x00, 'G' , 0x00, '\n', 0x00 + const unsigned char vmg_footer[0x15] = { + 0x00, '\n', 0x00, 'E', 0x00, 'N', 0x00, 'D', + 0x00, ':', 0x00, 'V', 0x00, 'M', 0x00, 'S', + 0x00, 'G', 0x00, '\n', 0x00 }; file_search_footer(file_recovery, vmg_footer, sizeof(vmg_footer), 0); } +/*@ + @ requires buffer_size >= 0 ; + @ requires \valid_read(buffer+(0..buffer_size-1)); + @ requires valid_file_recovery(file_recovery); + @ requires \valid(file_recovery_new); + @ requires file_recovery_new->blocksize > 0; + @ requires separation: \separated(&file_hint_vmg, buffer+(..), file_recovery, file_recovery_new); + @ ensures \result!=0 ==> valid_file_recovery(file_recovery_new); + @ assigns *file_recovery_new; + @*/ static int header_check_vmg(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new) { reset_file_recovery(file_recovery_new); - file_recovery_new->extension=file_hint_vmg.extension; - file_recovery_new->file_check=&file_check_vmg; + file_recovery_new->extension = file_hint_vmg.extension; + file_recovery_new->file_check = &file_check_vmg; return 1; } static void register_header_check_vmg(file_stat_t *file_stat) { - static const unsigned char vmg_header[0x28]= { - 'B' , 0x00, 'E' , 0x00, 'G' , 0x00, 'I' , 0x00, - 'N' , 0x00, ':' , 0x00, 'V' , 0x00, 'M' , 0x00, - 'S' , 0x00, 'G' , 0x00, '\n', 0x00, 'V' , 0x00, - 'E' , 0x00, 'R' , 0x00, 'S' , 0x00, 'I' , 0x00, - 'O' , 0x00, 'N' , 0x00, ':' , 0x00, '1' , 0x00 + static const unsigned char vmg_header[0x28] = { + 'B', 0x00, 'E', 0x00, 'G', 0x00, 'I', 0x00, + 'N', 0x00, ':', 0x00, 'V', 0x00, 'M', 0x00, + 'S', 0x00, 'G', 0x00, '\n', 0x00, 'V', 0x00, + 'E', 0x00, 'R', 0x00, 'S', 0x00, 'I', 0x00, + 'O', 0x00, 'N', 0x00, ':', 0x00, '1', 0x00 }; register_header_check(0, vmg_header, sizeof(vmg_header), &header_check_vmg, file_stat); }