From 5909fc97d0609bd77264efd7d3c2aa92f119b3eb Mon Sep 17 00:00:00 2001 From: Christophe Grenier Date: Sat, 13 Mar 2021 20:15:13 +0100 Subject: [PATCH] src/file_wee.c: add Frama-C annotations --- src/file_wee.c | 48 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/src/file_wee.c b/src/file_wee.c index 3bb653d4..e581bceb 100644 --- a/src/file_wee.c +++ b/src/file_wee.c @@ -31,39 +31,59 @@ #include "types.h" #include "filegen.h" +/*@ requires \valid(file_stat); */ static void register_header_check_wee(file_stat_t *file_stat); -const file_hint_t file_hint_wee= { - .extension="wee", - .description="weecast", - .max_filesize=PHOTOREC_MAX_FILE_SIZE, - .recover=1, - .enable_by_default=1, - .register_header_check=®ister_header_check_wee +const file_hint_t file_hint_wee = { + .extension = "wee", + .description = "weecast", + .max_filesize = PHOTOREC_MAX_FILE_SIZE, + .recover = 1, + .enable_by_default = 1, + .register_header_check = ®ister_header_check_wee }; +/*@ + @ 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_wee; + @ ensures \valid(file_recovery->handle); + @ assigns *file_recovery->handle, errno, file_recovery->file_size; + @ assigns Frama_C_entropy_source; + @*/ static void file_check_wee(file_recovery_t *file_recovery) { - const unsigned char wee_footer[7]= { - 'W' , 'E' , 'E' , 'X' , 0x21, 0x01, 0x00 + const unsigned char wee_footer[7] = { + 'W', 'E', 'E', 'X', 0x21, 0x01, 0x00 }; file_search_footer(file_recovery, wee_footer, sizeof(wee_footer), 17); } +/*@ + @ requires buffer_size >= 0x1b + 0xa; + @ 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_wee, buffer+(..), file_recovery, file_recovery_new); + @ ensures \result!=0 ==> valid_file_recovery(file_recovery_new); + @ assigns *file_recovery_new; + @*/ static int header_check_wee(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) { - if(buffer[0x1a]!=0xa || memcmp(&buffer[0x1b], "onMetaData", 0x0a)!=0) + if(buffer[0x1a] != 0xa || memcmp(&buffer[0x1b], "onMetaData", 0x0a) != 0) return 0; reset_file_recovery(file_recovery_new); - file_recovery_new->extension=file_hint_wee.extension; - file_recovery_new->file_check=&file_check_wee; + file_recovery_new->extension = file_hint_wee.extension; + file_recovery_new->file_check = &file_check_wee; return 1; } static void register_header_check_wee(file_stat_t *file_stat) { - static const unsigned char wee_header[7]= { - 'W' , 'E' , 'E' , 'X' , 0x21, 0x01, 0x00 + static const unsigned char wee_header[7] = { + 'W', 'E', 'E', 'X', 0x21, 0x01, 0x00 }; register_header_check(0, wee_header, sizeof(wee_header), &header_check_wee, file_stat); }