Интересно.Ваш пример не обработан -eva -eva-equality-domain
, который был написан с другими целями.Таким образом, специальный случай для x == y
, когда x
и y
, как известно, равны, не был записан.Это было бы довольно легко добавить.
(Учитывая имя домена, это может показаться удивительным. Домен равенства больше ориентирован на возможность более обратного распространения, когда у нас есть неинтересные псевдонимы, например, добавлены временные ссылкиядром.)
Что касается доменов, поступающих из Apron, это более удивительно.Я изменил ваш пример следующим образом:
j = i;
int b = j - i;
int c = j == i;
Frama_C_dump_each_domain();
Запуск frama-c -eva -eva-polka-equalities foo.c -value-msg-key d-apron
дает следующий результат:
[eva] c/eq.c:23:
Frama_C_dump_each_domain:
# Cvalue domain:
i ∈ [--..--]
j ∈ [--..--]
b ∈ {0}
c ∈ {0; 1}
__retres ∈ UNINITIALIZED
# Polka linear equalities domain:
[|-i_44+j_45=0; b_46=0|]
Как видите, Apron вывел соотношение между i
и j
(суффикс - номер строки), упрощенный b
до 0, но не упрощенный c
до 1. Это меня удивляет, но объясняет неточность, которую вы наблюдали.Он также не работает с доменом восьмиугольников.
Я не так хорошо знаком с абстрактными преобразователями в реляционных областях, поэтому этого можно ожидать, но это, безусловно, озадачивает.Код для обработки реляционных операторов существует во Frama-C / Eva / Apron, но частично написан на дому (это не просто вызов примитива Apron).В частности, он вызывает оператор вычитания и анализирует равенство результата с 0. Трудно понять, почему b
будет точным, а не c
.