2013-07-30 9 views
1

В следующем случае, как постусловия для поведения 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)) 
+0

Да, версия с прозвищем «Борон» довольно старая. Это новейшая версия, для которой двоичный файл Windows доступен на http://frama-c.com/. Возможно, поэтому вы его используете. Вы пробовали инструкции, написанные Стефаном Дюпратом (http://lists.gforge.inria.fr/pipermail/frama-c-discuss/2012-February/003040.html), чтобы получить две версии? –

+0

@ 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 упоминает только один. Благодаря! –

ответ

2

Что касается документации, то вы можете захотеть взглянуть на Fraunhofer FOKUS» ACSL По Пример: http://www.fokus.fraunhofer.de/de/quest/_download_quest/_projekte/acsl_by_example.pdf

Что касается вашего вопроса, я повторил ваш результат (BTW, вам не хватает #include <stdint.h>" в вашем коде) с фтором Frama-C, а Jessie + Alt-ergo все еще удается доказать пост-состояние. Но помните, что пост-условие доказано в соответствии с гипотезой о том, что ошибка времени выполнения не возникает, что не относится к вашему коду, так как неудачные показания безопасности ПО.

А именно, второе пост-условие содержит гипотезу (integer_of_int32(result) = (-integer_of_int32(v_2))), которую можно переписать как (integer_of_int32(result) = 2147483648). Это противоречит аксиоме прелюдии Джесси, которая гласит, что forall v:int32. integer_of_int32(v)<=2147483647.

Я полагаю, что это лишний раз указывает на то, что вы не можете утверждать, что подтвердили аннотацию ACSL, если некоторые обязательства по доказательству остаются непроверенными, даже если они не вытекают непосредственно из этой аннотации.

+0

спасибо - очень информативно! Как эта (противоречивая) гипотеза позволяет alt-ergo доказать, что integer_of_32 (return) == 2147483647? Например, противоречие, подобное этому, позволяет alt-ergo доказать все гипотезы или альтэрго найти доказательство, потому что для всего результата: int32 (например) распространяется только на int32?Шаги доказательства в gWhy (извините - gWhy не позволят мне копировать в буфер обмена) проходят гипотезу, которую вы упоминаете (H8, здесь), а затем через __retres и возвращаете гипотезы. –

+0

Это не просто альт-эрго. В принципе, как только у вас есть две противоречивые гипотезы в вашем контексте, вы можете доказать что угодно. Это очень старое логическое правило, настолько старое на самом деле, что оно имеет латинское имя: _Ex falso quod libet_ (из ложного [вывести], что вы хотите). – Virgile

+0

Как мы узнаем, что существует полный набор безопасных PO (RTE POs, в WP, теперь, когда я использую Flourine), так что по крайней мере один всегда будет терпеть неудачу в таких случаях, когда противоречивые гипотезы, генерируемые Frama -C разрешить ложные доказательства? Я предполагаю, что невозможно, или, по крайней мере, возможно, предотвратить создание Frama-C противоречивых гипотез из непротиворечивых спецификаций PO. –