假設我們有這樣的數據結構:ACSL「分配」註解爲內結構和的C代碼字段
#typedef struct
{
int C_Field;
}C;
#typedef struct
{
C B_Array[MAX_SIZE];
}B;
#typedef struct
{
B A_Array[MAX_SIZE];
}A;
似乎郵資-C不爲一個結構的一個字段分配一個位置在以下示例中鍵入C:
/*@
assigns Arg->A_Array[0..(MAX_SIZE - 1)].B_Array[0..(MAX_SIZE - 1)].C_Field;
*/
void Initialize (A * Arg);
上述註釋是否可由Frama-C接受?
該代碼詳細闡述如下。主要目標是到外地C_Field重置爲0:
/*@ predicate
ResetB (B * Arg) =
\forall integer Index; 0<= Index < MAX_SIZE ==>
Arg -> B_Array[Index].C_Field == 0;
*/
//@ assigns * Arg;
// Even I tried this:
//@ assigns Arg -> A_Array[0..(MAX_SIZE - 1)];
void Initialize (A * Arg)
{
/*@ loop invariant 0 <= Index <= MAX_SIZE;
loop invariant ResetB(&(Arg->A_Array[Index]));
loop assigns Index, Arg -> A_Array[0..(MAX_SIZE - 1)];
*/
for (int Index = 0; Index < MAX_SIZE; Index++)
{
Reset(&(Arg -> A_Array[Index]));
}
}
/*@ assigns Arg -> B_Array[0..(MAX_SIZE - 1)];
ensures ResetB(Arg);
*/
void Reset(B * Arg)
{
/*@ loop invariant 0 <= Index <= MAX_SIZE;
loop invariant \forall integer i; 0<= i < Index ==>
Arg -> B_Array[i].C_Field == 0;
loop assigns Index, Arg -> B_Array[0..(MAX_SIZE - 1)];
*/
for (int Index = 0; Index < MAX_SIZE; Index++)
{
Arg -> B_Array[Index].C_Field = 0;
}
}
功能復位的合同是滿意的,但功能初始化的合同是沒有的。如何爲Initialize的合同寫一個正確的「賦值」?
你的問題有點不清楚。 Frama-C Silicon(最新的穩定版本)可以很好地解析'assigns'(只要'typedef'前面的'#'被移除並給出'MAX_SIZE'的定義)。您能否描述一下您使用此代碼所做的嘗試,以及Frama-C給出的結果與預期的結果有何不同? – Virgile
感謝您的回覆。我們的主要目標是將字段C_Field重置爲0.上面的代碼詳細闡述如下: – Rocolife
歡迎使用StackOverflow。這應該是C語法?然後修復語法錯誤和/或預處理器/編譯器語法的奇怪混淆。我認爲@Virgile的意思是一樣的。然後提供[mcve]。否則,刪除C標籤。請考慮參加[旅遊]。 – Yunnosch