Как я должен подходить к доказательству правильности кода, как показано ниже, что, во избежание некоторой неэффективности, зависит от модульной арифметики?Доказательства для кода, основанного на переполнении целых чисел без знака?
#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;
}
Я экспериментировал с моделью РГ «ИНТ», но, если я правильно понимаю, что модель настраивает семантику логических чисел в ДДУ, а не формальные модели коды C. Например, плагины WP и RTE по-прежнему требуют и вводят PO-запросы подтверждения переполнения для беззнакового добавления выше при использовании модели «int».
В таких случаях можно добавить аннотации, содержащие логическую модель для оператора или базового блока, поэтому я мог бы рассказать Frama-C, как конкретный компилятор действительно интерпретирует инструкцию? Если это так, я мог бы использовать другие методы проверки для таких вещей, как поведение, связанное с определенным, но часто вызывающим дефекты, такое как неподписанное обертывание, поведение, определяемое компилятором, нестандартное поведение (встроенный assy?) И т. Д., А затем доказать правильность окружающий код. Я представляю нечто похожее (но более мощное, чем) «assert fix», используемое для информирования некоторых статических анализаторов о том, что некоторые свойства сохраняются, когда они не могут получить свойства для себя.
Я работаю с Frama-C Fluorine-20130601, для справки, с alt-ergo 95.1.
One проблема с вашим кодом: пусть 'a' будет' UINT32_MIN' и пусть 'b' будет' -1'. Как это обрабатывается? (У меня нет фона с вашими инструментами/конкретным компилятором) – BLaZuRE
@BLaZuRE: b не имеет знака и поэтому не может быть -1. –