@ @ requires \valid(file_recovery); @ requires valid_file_recovery(file_recovery); @ requires \valid_function(file_recovery->data_check); @ requires 0 < blocksize <= READ_SIZE; @ requires READ_SIZE % blocksize == 0; @ requires \valid(buffer_start + (0 .. blocksize + READ_SIZE -1)); @ requires \separated(file_recovery, &errno, buffer_start + (..)); @ decreases 0; @ ensures valid_
| 104 | @ assigns file_recovery->data_check, file_recovery->file_check, file_recovery->offset_error, file_recovery->offset_ok, file_recovery->time, file_recovery->data_check_tmp; |
| 105 | @*/ |
| 106 | static data_check_t data_check_aux(file_recovery_t *file_recovery, const unsigned int blocksize, char *buffer_start) |
| 107 | { |
| 108 | /*@ ghost const unsigned int buffer_size=blocksize + READ_SIZE; */ |
| 109 | /*@ |
| 110 | @ loop invariant valid_file_recovery(file_recovery); |
| 111 | @ loop invariant file_recovery == \at(file_recovery, Pre); |
| 112 | @ loop invariant \valid_read(buffer_start + (0 .. blocksize + READ_SIZE - 1)); |
| 113 | @ loop invariant file_recovery->calculated_file_size < PHOTOREC_MAX_FILE_SIZE; |
| 114 | @ loop invariant file_recovery->file_size < PHOTOREC_MAX_FILE_SIZE; |
| 115 | @ loop invariant \valid_function(file_recovery->data_check); |
| 116 | @ loop invariant \separated(file_recovery, &errno, buffer_start + (..)); |
| 117 | @ loop assigns *file_recovery->handle, errno; |
| 118 | @ loop assigns buffer_start[0 .. blocksize + READ_SIZE -1]; |
| 119 | @ loop assigns file_recovery->file_size; |
| 120 | @ loop assigns file_recovery->calculated_file_size, file_recovery->data_check_tmp; |
| 121 | @ loop assigns file_recovery->data_check, file_recovery->file_check, file_recovery->offset_error, file_recovery->offset_ok, file_recovery->time, file_recovery->data_check_tmp; |
| 122 | @*/ |
| 123 | while(1) |
| 124 | { |
| 125 | char *buffer=buffer_start+blocksize; |
| 126 | unsigned int i; |
| 127 | size_t lu=0; |
| 128 | /*@ assert valid_file_recovery(file_recovery); */ |
| 129 | memset(buffer, 0, READ_SIZE); |
| 130 | lu=fread(buffer, 1, READ_SIZE, file_recovery->handle); |
| 131 | if(lu <= 0) |
| 132 | { |
| 133 | /*@ assert valid_file_recovery(file_recovery); */ |
| 134 | return DC_STOP; |
| 135 | } |
| 136 | /*@ assert 0 < lu <= READ_SIZE; */ |
| 137 | /*@ |
| 138 | @ loop invariant valid_file_recovery(file_recovery); |
| 139 | @ loop invariant file_recovery == \at(file_recovery, Pre); |
| 140 | @ loop invariant \valid_read(buffer_start + (0 .. blocksize + READ_SIZE - 1)); |
| 141 | @ loop invariant file_recovery->calculated_file_size < PHOTOREC_MAX_FILE_SIZE; |
| 142 | @ loop invariant file_recovery->file_size < PHOTOREC_MAX_FILE_SIZE; |
| 143 | @ loop invariant \valid_function(file_recovery->data_check); |
| 144 | @ loop invariant \separated(file_recovery, &errno, buffer_start + (..)); |
| 145 | @ loop assigns i, file_recovery->file_size; |
| 146 | @ loop assigns file_recovery->calculated_file_size, file_recovery->data_check_tmp; |
| 147 | @ loop assigns file_recovery->data_check, file_recovery->file_check, file_recovery->offset_error, file_recovery->offset_ok, file_recovery->time, file_recovery->data_check_tmp; |
| 148 | @ loop variant lu - i; |
| 149 | @*/ |
| 150 | for(i=0; i<lu; i+=blocksize) |
| 151 | { |
| 152 | /*@ assert i + 2*blocksize <= buffer_size; */ |
| 153 | /*@ assert \valid_read(&buffer_start[i] + (0 .. 2*blocksize-1)); */ |
| 154 | const data_check_t res=data_check_wrapper((const unsigned char *) &buffer_start[i], 2*blocksize, file_recovery); |
| 155 | /*@ assert valid_data_check_result(res, file_recovery); */ |
| 156 | /*@ assert \valid_read(&buffer_start[i] + (0 .. 2*blocksize-1)); */ |
| 157 | file_recovery->file_size+=blocksize; |
| 158 | if(res != DC_CONTINUE || file_recovery->data_check==NULL) |
| 159 | { |
| 160 | /*@ assert valid_file_recovery(file_recovery); */ |
| 161 | return res; |
| 162 | } |
| 163 | if( file_recovery->calculated_file_size >= PHOTOREC_MAX_FILE_SIZE || |
no test coverage detected