Come dovrei avvicinarmi a dimostrare la correttezza del codice come il seguente, che, per evitare qualche inefficienza, si basa sull'aritmetica modulare?Prova del codice che si basa sull'overflow di numeri interi senza segno?
#include <stdint.h>
uint32_t my_add(uint32_t a, uint32_t b) {
uint32_t r = a + b;
if (r < a)
return UINT32_MAX;
return r;
}
Ho sperimentato con il modello "int" di WP, ma, se ho capito bene, quel modello configura la semantica di interi logiche OP, non i modelli formali di codice C. Ad esempio, i plug-in WP e RTE richiedono ancora e iniettano PO di asserzione di overflow per l'aggiunta senza segno sopra quando si utilizza il modello "int".
In casi come questo, posso aggiungere annotazioni che stabiliscono un modello logico per un'istruzione o un blocco di base, così ho potuto dire a Frama-C come un particolare compilatore interpreta effettivamente un'istruzione? In tal caso, potrei usare altre tecniche di verifica per cose come comportamenti definiti, ma spesso causa di difetti come involontari involontari, comportamenti definiti dal compilatore, comportamenti non standard (in linea assy?), Ecc., E quindi provare la correttezza per codice circostante. Sto immaginando qualcosa di simile a (ma più potente di) la "assert fix" usata per informare alcuni analizzatori statici che certe proprietà mantengono quando non possono derivare le proprietà da sole.
Sto lavorando con Frama-C Fluorine-20130601, per riferimento, con alt-ergo 95.1.
One problema con il tuo codice: sia 'a' essere' UINT32_MIN' e sia 'b' essere' -1'. Come viene gestito questo? (Non ho sfondo con i tuoi strumenti/compilatore specifico) – BLaZuRE
@BLaZuRE: b non è firmato e quindi non può essere -1. –