src/file_ttf.c: Fix frama-c warnings

This commit is contained in:
Christophe Grenier 2020-10-24 09:05:07 +02:00
parent 73ebc243b1
commit 9c3096c847

View file

@ -64,9 +64,16 @@ struct ttf_table_directory
uint32_t length; /* Length of this table. */ uint32_t length; /* Length of this table. */
}; };
/*@
@ assigns \nothing;
@*/
static unsigned int td_ilog2(unsigned int v) static unsigned int td_ilog2(unsigned int v)
{ {
unsigned int l = 0; unsigned int l = 0;
/*@
@ loop assigns v,l;
@ loop unroll 16;
@*/
while(v >>= 1) while(v >>= 1)
l++; l++;
return l; return l;
@ -75,30 +82,45 @@ static unsigned int td_ilog2(unsigned int v)
static int header_check_ttf(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) static int header_check_ttf(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)
{ {
const struct ttf_offset_table *ttf=(const struct ttf_offset_table *)buffer; const struct ttf_offset_table *ttf=(const struct ttf_offset_table *)buffer;
unsigned int numTables; const unsigned int numTables=be16(ttf->numTables);
numTables=be16(ttf->numTables); const unsigned int entrySelector=be16(ttf->entrySelector);
const unsigned int searchRange=be16(ttf->searchRange);
const unsigned int rangeShift=be16(ttf->rangeShift);
if(numTables == 0)
return 0;
/* searchRange (Maximum power of 2 <= numTables) x 16. /* searchRange (Maximum power of 2 <= numTables) x 16.
* entrySelector Log2(maximum power of 2 <= numTables). * entrySelector Log2(maximum power of 2 <= numTables).
* rangeShift NumTables x 16-searchRange. * rangeShift NumTables x 16-searchRange.
* */ * */
if(td_ilog2(numTables) != (uint16_t)be16(ttf->entrySelector)) if(td_ilog2(numTables) != entrySelector)
return 0; return 0;
if((16<<be16(ttf->entrySelector)) != be16(ttf->searchRange)) if((16<<entrySelector) != searchRange)
return 0; return 0;
if(numTables * 16 != (unsigned int)be16(ttf->rangeShift)+be16(ttf->searchRange)) if(numTables * 16 != rangeShift+searchRange)
return 0; return 0;
reset_file_recovery(file_recovery_new); reset_file_recovery(file_recovery_new);
file_recovery_new->extension=file_hint_ttf.extension; file_recovery_new->extension=file_hint_ttf.extension;
if(sizeof(struct ttf_offset_table) + numTables * sizeof(struct ttf_table_directory) if(sizeof(struct ttf_offset_table) + numTables * sizeof(struct ttf_table_directory)
<= buffer_size) <= buffer_size)
{ {
const struct ttf_table_directory*ttf_dir=(const struct ttf_table_directory*)(ttf+1); /*@ assert sizeof(struct ttf_offset_table) + numTables * sizeof(struct ttf_table_directory) <= buffer_size; */
/*@ assert numTables * sizeof(struct ttf_table_directory) <= buffer_size - sizeof(struct ttf_offset_table); */
/*@ assert numTables <= (buffer_size - sizeof(struct ttf_offset_table)) / sizeof(struct ttf_table_directory); */
/*@ assert \valid_read(buffer + (0 .. buffer_size - 1)); */
/*@ assert \valid_read(buffer + (0 .. sizeof(struct ttf_offset_table) + numTables * sizeof(struct ttf_table_directory) - 1)); */
uint64_t max_offset=0; uint64_t max_offset=0;
unsigned int i; unsigned int i;
for(i=0; i<numTables; i++,ttf_dir++) const struct ttf_table_directory*ttf_dir=(const struct ttf_table_directory*)&buffer[sizeof(struct ttf_offset_table)];
/*@ assert \valid_read(ttf_dir + (0 .. numTables -1)); */
/*@
@ loop assigns i, max_offset;
@*/
for(i=0; i<numTables; i++)
{ {
/*@ assert 0 <= i < numTables; */
/*@ assert \valid_read(&ttf_dir[i]); */
/* | 0x3: align the end of the table */ /* | 0x3: align the end of the table */
const uint64_t new_offset=(be32(ttf_dir->offset) + be32(ttf_dir->length))|0x3; const uint64_t new_offset=((uint64_t)be32(ttf_dir[i].offset) + be32(ttf_dir[i].length))|0x3;
if(max_offset < new_offset) if(max_offset < new_offset)
max_offset=new_offset; max_offset=new_offset;
} }