Я хотел бы иметь способ описать структуры уровня логики/спецификации, которые включают абстрактные списки. Пример 2.2.7 на странице 27 Справочное руководство ACSL предполагает, что существует способ сделать это, и это выглядит следующим образом:
//@ type point = struct { real x; real y; };
//@ type triangle = point[3];
//@ logic point origin = { .x = 0.0 , .y = 0.0 };
/*@ logic triangle t_iso = { [0] = origin,
@ [1] = { .y = 2.0 , .x = 0.0 }
@ [2] = { .x = 2.0 , .y = 0.0 }};
@*/
/*@ logic point centroid(triangle t) = {
@ .x = mean3(t[0].x,t[1].x,t[2].x);
@ .y = mean3(t[0].y,t[1].y,t[2].y);
@ };
@*/
//@ type polygon = point[];
/*@ logic perimeter(polygon p) =
@ \sum(0,\length(p)-1,\lambda integer i;d(p[i],p[(i+1) % \length(p)])) ;
@*/
Если я скопирую/вставлю этот точный код в текстовый редактор и попытаюсь запустить этот код с плагином wp с помощью:
frama-c -wp -wp-rte -wp-prover alt-ergo shapes.c
Я получаю сообщение об ошибке:
[kernel:annot-error] shapes.c:1: Warning: unexpected token '{'
Если я откажусь от попыток написать объявления типов структур на уровне логики/спецификации, но все же хотел бы написать выражения на уровне логики/спецификации, которые создают экземпляры структур, определенных в C, следующим образом:
struct somestruct {
int x;
int y;
};
/*@
logic struct somestruct foo = { .x = 3, .y = 4 };
*/
Я все еще получаю сообщение об ошибке:
[kernel:annot-error] aggregate_err.c:7: Warning:
unsupported aggregated field construct. Ignoring global annotation
и отсутствие возможности записывать конкретные значения структур в виде выражений в спецификациях приводит к довольно уродливым спецификациям, поэтому я надеюсь, что делаю что-то не так.
Если я покопаюсь в исходниках frama-C 20.0, чтобы попытаться найти часть кода парсера-генератора для объявлений /*@ type
, окажется, что синтаксис в Ex 2.2.7 на самом деле не реализован. Похоже, что синтаксис для объявлений уровня типа - это строка 799 frama-c-20.0-Calcium/src/kernel_internals/parsing/logic_parser.mly (называется type_spec). И правило анализа для объявлений уровня типа структур:
| STRUCT exit_rt_type identifier_or_typename { LTstruct $3 }
который, похоже, будет поддерживать
//@ type foo = struct c_struct;
но не что-то вроде того, что есть в Ex 2.2.7, как в:
//@ type point = struct { real x; real y; };
Есть ли что-то еще, что я должен сделать, чтобы улучшить поддержку структур в ACSL/Frama-C? Спасибо!