Невозможно доказать оговорку о назначении - Frama-C

Я новичок в 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-c (WP + Value) не подтвердит пункт assign в функциональном контракте, и я не могу понять, почему. Любая помощь будет оценена =)


person roo    schedule 23.05.2013    source источник
comment
Зачем? Разве это не нормально? Я просто хочу заполнить массив int (объявленный статически) нулями... Разве int * array[] не является массивом указателей int?? В любом случае, это не помогает :/   -  person roo    schedule 23.05.2013
comment
Я не понимаю, что вы имеете в виду. Даже с этим заполнением подписи (int * array, int length) проблема все еще здесь...   -  person roo    schedule 23.05.2013
comment
@EliasVanOotegem В C массивы передаются по ссылке. Функционал нормальный, характеристики хорошие. Подключаемый модуль Value не проверяет «присваивает», потому что он не предназначен для этого (он использует только предложения «присваивает» в качестве источника информации и только для библиотечных функций без исходного кода). Я думал, что WP это докажет. Ру, какие автоматические пруверы у тебя установлены?   -  person Pascal Cuoq    schedule 23.05.2013
comment
Поскольку length передается как int, я бы добавил предварительное условие, что length равно ≥0 или >0 (в зависимости от того, что вы предпочитаете).   -  person Pascal Cuoq    schedule 23.05.2013
comment
@PascalCuoq: Плохо, я погуглил Frama-C и теперь знаю, о чем этот вопрос. Поэтому и прокомментировал, а не стал писать пространный ответ. У меня сложилось впечатление, что это нечто большее, чем я думал вначале...   -  person Elias Van Ootegem    schedule 23.05.2013
comment
@PascalCuoq: добавление длины предусловия ›= 0 или длины › 0 не решает проблему (разве это не подразумевается предусловием \valid(array+(0..length-1))??). У меня Альт-Эрго.   -  person roo    schedule 23.05.2013


Ответы (1)


Это можно доказать (с альтернативой 0.95.1), если вы ослабите назначение циклов.

@ цикл присваивает i, array[0..length-1];

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

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

person byako    schedule 24.05.2013
comment
Привет Борис, спасибо за ответ. Я знал, что могу доказать это, ослабив присваивание цикла, но я хотел знать, почему это не работает с более сильным, но правильным предложением. Спасибо за объяснения! - person roo; 24.05.2013
comment
Если вам понравился ответ Бориса, вы должны отметить его как принятый (галочка под кнопками голосования). - person Daniel H; 25.06.2014