Спецификация 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 ответ
Ваша спецификация является самой близкой, которая может сказать, что функция находится в цикле навсегда, но я все еще вижу два угловых случая:
- Ошибка времени выполнения: вы всегда можете сказать, что о них позаботились в другом месте (
WP
+genassigns
или жеValue
) - longjmp: боюсь, в настоящее время в ACSL ничего не указывается.