Спецификация ACSL для возможно бесконечной функции C

Я пытаюсь уточнить поведение внешних функций, точнее, их прекращение. В документации ACSL сказано, что \terminates p; свойство указывает, что если предикат p удерживается, то функция гарантированно завершается, но ничего не указывает, когда p не держит Это также объясняет, что функция, которая никогда не возвращается, может быть определена с помощью:

//@ ensures \false ; terminates \false ;

Кроме того, ACSL предоставляют недвижимость \exits p; указать постусловие в случае внезапного прекращения. Так что мне интересно, если:

//@ ensures \false ; exits \false; terminates \false ;

будет указывать, что функция всегда цикл навсегда?

Кроме того, что означает спецификация:

//@ ensures p ; exits q; terminates \false ;

имеется ввиду относительно возможного бесконечного цикла?

1 ответ

Решение

Ваша спецификация является самой близкой, которая может сказать, что функция находится в цикле навсегда, но я все еще вижу два угловых случая:

  1. Ошибка времени выполнения: вы всегда можете сказать, что о них позаботились в другом месте (WP+genassigns или же Value)
  2. longjmp: боюсь, в настоящее время в ACSL ничего не указывается.
Другие вопросы по тегам