Использование VST с GCC

В руководстве Verified-C говорится

Какое бы наблюдаемое свойство программы на языке C вы ни доказали, используя логику проверяемой программы на языке C, это свойство фактически сохранится в программе на языке ассемблера, созданной компилятором C.

а потом

Логика программы проверена с точки зрения семантики CompCert C (...).

Что, если я использую другой компилятор (скажем, gcc — при условии, что сам gcc верен стандарту C)?

Предполагает ли логика (или clightgen) факты, которые не могут быть проверены каким-либо C-совместимым компилятором, не являющимся Compcert?

Редактировать:

Я провел небольшой эксперимент, скомпилировав его с помощью gcc и compcert.

      #include<stdio.h>
#include<limits.h>

int signed_overflow_expression(int x, int y) {
    return (x+y) > y;
}

int main(){
    printf("%i",signed_overflow_expression(INT_MAX,1));
}

gcc печатает 1, как описано здесь /questions/4489521/pochemu-kak-gcc-kompiliruet-neopredelennoe-povedenie-v-etom-teste-s-perepolneniem-so-znakom-chtobyi-on-rabotal-na-x86-no-ne-na-arm64/4489540#4489540.

Compcert печатает 0, потому что подписанное переполнение фактически определено поведением в Compcert C (см. §6.5 в руководстве Compcert https://compcert.org/man/manual005.html).

Однако VST требует, чтобы не было подписанных переполнений, поэтому я не могу доказать ничего, что было бы правильно для Compcert, а не для gcc. Это означает, что VST не совсем моделирует Compcert C, а является чем-то более близким к Standard C.

Кажется, это указывает на то, что я действительно могу использовать gcc, но мне интересно, есть ли другие ситуации, когда что-то может пойти не так.

0 ответов

Другие вопросы по тегам