2013-05-23 6 views
4

Я новичок в Фрам-с, и я хотел бы понять, что проблема с этим простым примером:Невозможно доказать, присвойте положение - FRAMA-C

/*@ requires \valid(array+(0..length-1)) 
@ ensures \forall integer k; 0 <= k < length ==> array[k] == 0; 
@ assigns array[0..length-1]; 
*/ 
void fill(int array[], int length){ 
    /*@ loop invariant 0 <= i <= length; 
    @ loop invariant \forall integer k; 0 <= k < i ==> array[k] == 0; 
    @ loop assigns i, array[0..i-1]; 
    @ loop variant length - i; 
    */ 
    for(int i = 0; i < length; i++){ 
     array[i] = 0; 
    } 
} 

В этом примере Frama-с (WP + Value) не докажет предложение присваивания в контракте функции, и я не могу понять, почему. Любая помощь будет оценена =)

+0

Почему? Разве это не нормально? Я просто хочу заполнить массив int (объявлен статически) нулями ... Не int * array [] массив int указателей? Во всяком случае, это не делает трюк:/ – roo

+0

Я не понимаю, что вы имеете в виду. Даже с этой подписью fill (int * array, int length) проблема все еще здесь ... – roo

+0

@EliasVanOotegem В C массивы передаются по ссылке. Функция прекрасна, и характеристики в порядке. Плагин Value не доказывает «присваивает», потому что он не стремится сделать это (он использует только «присваивает» клаузулы в качестве источника информации и только для функций библиотеки без исходного кода). Я думал, что WP это докажет. Roo, какие автоматические указатели вы установили? –

ответ

3

Это может быть доказано (с помощью alt-ergo 0.95.1), если вы ослабляете свои назначения циклов.

@ loop присваивает i, массив [0..length-1];

Предпосылкой i >= 0 также необходима, потому что это не подразумевается \valid(array+(0..length-1). array+(0..length-1) - действительный набор мест с length <= 0, хотя пустой.

Тот факт, что ваш исходный цикл присваивает, не означает, что ваше предварительное условие является ограничением текущей версии WP-плагина.

+0

Привет, Борис, спасибо за ваш ответ. Я знал, что могу доказать это, ослабив назначение циклов, но я хотел знать, почему он не работает с более сильной, но правильной оговоркой. Спасибо за объяснения! – roo

+0

Если вам нравится ответ Бориса, вы должны отметить его как принятый (галочка под кнопками голосования). –

 Смежные вопросы

  • Нет связанных вопросов^_^