В следующем случае, как постусловия для поведения neg_limit доказано истинно, когда соответствующий код C закомментирован?гарантирует, что код неисправен?
Один из проверочных арифметических перегрузок Safety-> не может быть доказан, как и ожидалось, но, похоже, neg_limit также должен быть недоказуемым.
Контекст: Я использую Frama-C-Boron, Jessie и через gWhy Alt-Ergo, чтобы научиться писать спецификации и доказывать, что функции встречаются с ними. Также приветствуются любые cluebatting, RTFMing и т. Д. О стратегиях разработки, инструментах и т. Д. До сих пор я читаю как руководство по внедрению ACSL 1.7 (это последнее, что -Boron's), так и учебник Jessie & ref. руководство.
Спасибо!
/*@ behavior non_neg:
assumes v >= 0;
ensures \result == v;
behavior neg_in_range:
assumes INT32_MIN < v < 0;
ensures \result == -v;
behavior neg_limit:
assumes v == INT32_MIN;
ensures \result == INT32_MAX;
disjoint behaviors;
complete behaviors;
*/
int32_t my_abs32(int32_t v)
{
if (v >= 0)
return v;
//if (v == INT32_MIN)
// return INT32_MAX;
return -v;
}
Вот цель gWhy первый постусловии:
goal my_abs32_ensures_neg_limit_po_1:
forall v_2:int32.
(integer_of_int32(v_2) = ((-2147483647) - 1)) ->
(integer_of_int32(v_2) >= 0) ->
forall __retres:int32.
(__retres = v_2) ->
forall return:int32.
(return = __retres) ->
("JC_13": (integer_of_int32(return) = 2147483647))
и для второй:
goal my_abs32_ensures_neg_limit_po_2:
forall v_2:int32.
(integer_of_int32(v_2) = ((-2147483647) - 1)) ->
(integer_of_int32(v_2) < 0) ->
forall result:int32.
(integer_of_int32(result) = (-integer_of_int32(v_2))) ->
forall __retres:int32.
(__retres = result) ->
forall return:int32.
(return = __retres) ->
("JC_13": (integer_of_int32(return) = 2147483647))
Да, версия с прозвищем «Борон» довольно старая. Это новейшая версия, для которой двоичный файл Windows доступен на http://frama-c.com/. Возможно, поэтому вы его используете. Вы пробовали инструкции, написанные Стефаном Дюпратом (http://lists.gforge.inria.fr/pipermail/frama-c-discuss/2012-February/003040.html), чтобы получить две версии? –
@ pascal-cuoq, теперь, спасибо, и теперь я работаю с WP. Если другие люди найдут это, вам понадобится alt-ergo-0.94-mingw.exe. Инструкции по азоту над бором указывают на это, но, похоже, не требуют этого. Чтобы установить: загрузите его, переименуйте в alt-ergo.exe и поместите его где-нибудь в свой PATH перед мусором Boron. Я избегал alt-ergo-0.95-mingw.exe, потому что его сайт говорит, что он несовместим с Frama-C-Oxygen, а 0,94, как известно, работает с -Nitrogen. Также: следуйте инструкциям этой ссылки, чтобы установить все три FRAMAC_ * env. вары; INSTALL.txt упоминает только один. Благодаря! –