Frama-c, недетерминированные значения с плавающей точкой

В качестве примера я использую следующую функцию:

float nondet_float(){
  float x;
  return x;
}

int main(){
  float x = nondet_float();
  if(isnan(x)){
    some_error();
  }
}

Интересно, как мне использовать frama-c для симуляции недетерминированных операций с плавающей точкой?

Я хочу, чтобы переменная x рассматривалась как любое возможное значение с плавающей запятой, включая -inf, +inf и NaN.

Я хотел бы получить результат, что some_error() достижимо, если x равен NaN.

Итак, мой вопрос:

как мне симулировать недетерминированные поплавки? Как проверить доступность определенных вызовов функций?

1 ответ

Frama-C представляет собой набор плагинов, с разным уровнем поддержки для бесконечных /NaN значений с плавающей точкой. Я считаю, что WP поддерживает NaN и бесконечность; но это, вероятно, зависит от выбранной вами числовой модели (опция -wp-model).

Для плагина абстрактной интерпретации (EVA, ранее Value), NaN и бесконечности на данный момент не поддерживаются. Анализатор предполагает (и доказывает), что все значения с плавающей запятой конечны. Поддержка не конечных будет добавлена ​​в Frama-C Sulphur.

Кроме того, ваш nondet_float функция недействительна в любом случае. Возврат неинициализированных значений запрещен стандартом C, и эта функция будет помечена как неправильная, например, EVA. Вместо этого вы должны использовать функцию без тела, с предложением assigns \result \from \nothing как его спецификация.

Другие вопросы по тегам