Ошибка компиляции E-ACSL FRAMA-C

Я новичок в фреймворке Frama-C и пытаюсь провести контрактное тестирование с программами на C. Я намерен использовать для этого подключаемый модуль E-ACSL, и я пробовал тестовую программу, чтобы увидеть, как она работает, но получаю некоторые ошибки компиляции. Вот мой код:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
int x = 0;
  /*@ assert x == 1;*/
  /*@ assert x == 0;*/
  return 0;
}

Затем, вот аннотированный код Frama-C:

/* Generated by Frama-C */
#include "stdio.h"
#include "stdlib.h"
struct __e_acsl_mpz_struct {
   int _mp_alloc ;
   int _mp_size ;
   unsigned long *_mp_d ;
};
typedef struct __e_acsl_mpz_struct __e_acsl_mpz_struct;
typedef __e_acsl_mpz_struct ( __attribute__((__FC_BUILTIN__)) __e_acsl_mpz_t)[1];
/*@ ghost extern int __e_acsl_init; */

/*@ ghost extern int __e_acsl_internal_heap; */

extern size_t __e_acsl_heap_allocation_size;

/*@
predicate diffSize{L1, L2}(ℤ i) =
  \at(__e_acsl_heap_allocation_size,L1) -
  \at(__e_acsl_heap_allocation_size,L2) ≡ i;

*/
int main(void)
{
  int __retres;
  int x = 0;
  /*@ assert x ≡ 1; */ ;
  /*@ assert x ≡ 0; */ ;
  __retres = 0;
  return __retres;
}

Наконец, я пытаюсь скомпилировать его с помощью gcc и указывает руководство (стр. 13), но я получить следующие ошибки (и предупреждения):

$ gcc monitored_second.c -o monitored_second -leacsl -leacsl-gmp -leacsl -jemalloc -lpthread -lm

monitored_second.c:10:1: warning: ‘__FC_BUILTIN__’ attribute directive ignored [-Wattributes]
 typedef __e_acsl_mpz_struct ( __attribute__((__FC_BUILTIN__)) __e_acsl_mpz_t)[1];

monitored_second.c:18:55: warning: ‘__FC_BUILTIN__’ attribute directive ignored [-Wattributes]
                                                   int line);
                                                   ^
monitored_second.c:25:60: warning: ‘__FC_BUILTIN__’ attribute directive ignored [-Wattributes]
                                                        size_t ptr_size);
                                                        ^
/usr/bin/ld: cannot find -leacsl
/usr/bin/ld: cannot find -leacsl-jemalloc
collect2: error: ld returned 1 exit status

Я также удалил метку «-rtl-bittree», потому что она возвращает другую ошибку.

Последняя версия Frama-C: Sulphur-20171101 Есть идеи, что происходит?

Спасибо!


person Raul Coroban    schedule 03.04.2018    source источник
comment
Предупреждения объясняются на стр. 13.   -  person melpomene    schedule 03.04.2018
comment
Я думаю, вам может понадобиться передать флаг компоновщика -L, указывающий компилятору, где найти библиотеки, которые вы хотите связать. Найдите каталог, содержащий файл с именем libeacsl.so или похожий.   -  person Isabelle Newbie    schedule 03.04.2018


Ответы (1)


Обычно у вас должен быть скрипт с именем e-acsl-gcc.sh, установленный в том же каталоге, что и двоичный файл frama-c, который может позаботиться о вызове gcc с соответствующими параметрами. Его основное использование задокументировано в разделе 2.2 руководства, а man e-acsl-gcc.sh дает более подробную информацию о параметрах, которые можно использовать. Короче говоря, вы должны быть в состоянии ввести

e-acsl-gcc.sh -c \
  --oexec-eacsl=first_monitored \
  --oexec=first \
  --ocode=first_monitored.i \
  first.i

чтобы получить

  • исполняемый файл first_monitored с инструментами e-acsl
  • исполняемый файл first с оригинальной программой
  • исходный файл first_monitored.i с кодом C, сгенерированным e-acsl

Редактировать Глядя на команду связывания, используемую скриптом, я бы сказал, что командная строка, предложенная ранее в руководстве, устарела (в частности, она относится к eacsl-jemalloc, тогда как e-acsl-gcc.sh, похоже, предпочитает eacsl-dlmalloc) , о котором, вероятно, можно сообщить как об ошибке на странице https://bts.frama-c.com.

person Virgile    schedule 04.04.2018