Frama-C сообщает о недопустимом привидении в спецификации внешней связи при загрузке файлов .C

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

  [kernel] FRAMAC_SHARE/libc/__fc_alloc_axiomatic.h:30: 
  invalid ghost in extern linkage specification:
  Location: between lines 30 and 45, before or at token: }
  28    #include "__fc_define_wchar_t.h"
  29    

  30    __BEGIN_DECLS
  31    
  32    /*@ ghost extern int __fc_heap_status __attribute__((FRAMA_C_MODEL)); */
  33    
  34    /*@ axiomatic dynamic_allocation {
  35      @   predicate is_allocable{L}(integer n) // Can a block of n bytes be allocated?
  36      @     reads __fc_heap_status;
  37      @   // The logic label L is not used, but it must be present because the
  38      @   // predicate depends on the memory state
  39      @   axiom never_allocable{L}:
  40      @     \forall integer i;
  41      @        i < 0 || i > __FC_SIZE_MAX ==> !is_allocable(i);
  42      @ }
  43    */
  44    
  45    __END_DECLS

  46    
  47    __POP_FC_STDLIB

Похоже, что ошибка в библиотеке спецификаций функций Frama-C? Я использую Frama-C 20.0 (Calcium) на Ubuntu 19.10. Frama-C был установлен через opam. Любое понимание того, что это означает, было бы очень полезно.


person Daniel Genin    schedule 05.06.2020    source источник
comment
Я не могу воспроизвести вашу проблему с Frama-C 20.0, запустив ее непосредственно в $FRAMA_C_SHARE/libc/__fc_alloc_axiomatic.h или в образце test.c файла, который включает stdlib.h (который, в свою очередь, включает __fc_alloc_axiomatic.h), используя в качестве командной строки frama-c -print test.c. Не могли бы вы предоставить mcve?   -  person Virgile    schedule 08.06.2020
comment
Я проследил проблему до расширения файла. Кажется, если расширение файла .C, файл интерпретируется как C ++ (возможно), и включение stdlib.h вызывает ошибку. Я не проверял, вызывают ли проблемы другие librareris. Если расширение - .c, то файл интерпретируется как обычный C, и файл загружается нормально. Таким минимальным примером является #include<stdlib.h> в файле с именем test.C.   -  person Daniel Genin    schedule 09.06.2020
comment
да, суффикс .C здесь проблема. и потребует отредактировать вопрос, чтобы прямо упомянуть этот факт.   -  person Virgile    schedule 10.06.2020


Ответы (1)


tl; dr: не используйте .C вместо .c в качестве суффикса для файла C. В частности, gcc по умолчанию распознает этот суффикс как C ++ вместо исходного кода C. .

более длинный ответ с ужасными техническими подробностями: если вы запустите frama-c (без очень экспериментального frama-clang) в файле с именем file.C (с суффиксом C в верхнем регистре) препроцессор, вызываемый Frama-C, будет считать, что он обрабатывает исходный файл C ++. Технически это означает, что он будет определять стандартный макрос _cplusplus, что, в свою очередь, означает, что макрос __BEGIN_DECL, найденный в stdlib.h файле libc Frama-C, будет расширен, как если бы он был включен в C ++ (то есть как extern "C" {).

Если бы frama-clang был установлен, он бы позаботился о синтаксическом анализе файла и должен был бы успешно. Если это не так, вызывается обычный синтаксический анализатор Frama-C. Он имеет некоторую ограниченную поддержку для обработки extern "C" спецификаций связывания, поскольку они могут появляться в некоторых общих заголовках C / C ++, хотя, строго говоря, это не стандартный C, но не все конструкции обрабатываются в этом контексте.

person Virgile    schedule 10.06.2020
comment
Сообщение об ошибке не очень помогло. Было бы неплохо, если бы в списке можно было намекнуть, что существует потенциальное языковое несоответствие. - person Daniel Genin; 11.06.2020