Bazı verimsizlikten kaçınmak için modüler aritmetiğe dayanan aşağıdaki gibi kodun doğruluğunu kanıtlamaya nasıl yaklaşmalıyım?İmzasız tamsayı taşmasına dayanan kod kanıtları mı?
#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;
}
eğer doğru anlamak ben, RP'nin "int" modeliyle denedi, ancak ettik o modeli PO'lara mantıksal tamsayılar anlamlandırmasını C kodunun değil biçimsel modeller yapılandırır. Örneğin, WP ve RTE eklentileri hala "int" modeli kullanılırken yukarıdaki imzasız ekleme için taşma savı PO'larını gerektirir ve enjekte eder.
Böyle durumlarda, bir deyim veya temel blok için mantıksal bir model öngören ek açıklamalar ekleyebilirim, bu yüzden Frama-C'ye belirli bir derleyicinin gerçekten bir ifadeyi nasıl yorumladığını söyleyebilirim? Öyleyse, imzasız sarmalayıcı, derleyici tanımlı davranışlar, standart olmayan davranışlar (satır içi assy?), Vb. Gibi tanımlanmış ama çoğu kez kusurlu indükleyici davranışlar gibi diğer doğrulama tekniklerini kullanabilirim. çevreleyen kod. Bazı özelliklerin kendileri için özellikleri elde edemedikleri zaman tuttukları bazı statik analizcileri bilgilendirmek için kullanılan "assert düzeltme" ye benzer (ama daha güçlü) bir resim çiziyorum.
Alt-ergo 95.1 ile referans için Frama-C Fluorine-20130601 ile çalışıyorum.
One: Bu Varsayılan olarak
frama-c -rte -pp-annot file.c -then -wp
tarafından yapılır, rte Yukarıdaki komut satırı ile, senin işlev aşağıdaki şartname saygı kanıtlamak mümkün değilim böylece bir hata olması imzasız taşması dikkate almaz kodunuzla ilgili sorun: '' '' UINT32_MIN' 'olsun ve' '' '' ''olsun. Bu nasıl ele alınır? (Sizin araçları/özel derleyici ile hiç arka planım yok) – BLaZuRE@BLaZuRE: b imzasız ve -1 olamaz. –