В ACSL действительно нет прямой возможности сделать это: контракт функции определяет только то, что происходит во время одного вызова функции.Вы действительно могли бы полагаться на объявленную, но оставленную неопределенную логическую функцию, с предложением reads
, которое определяет часть состояния памяти C, которая понадобится функции для вычисления ее результата, например,
/*@ logic boolean unknown_function{L}(int* a, int* b) reads a[0 .. 1], b[2 .. 3]; */
но если вы работаете с void *
, не зная размера базовых объектов, это может быть сложно определить: если результат unknown_function
не зависит исключительно от значения указателя, а не от содержимогоостроконечный объект, в этом случае вам не нужен этот reads
трюк.
Кроме того, обратите внимание, что контракты по указателям на функции пока не поддерживаются, что, вероятно, будет проблемой для того, что вы намерены делать, еслиЯ правильно понимаю ваш последний абзац.
Наконец, вас может заинтересовать новый плагин RPP, который предлагает способ указания, подтверждения и использования свойств, связанных с несколькими вызовами одной или нескольких функций C (с).Он описан здесь и здесь , и публичное издание должно произойти в не столь отдаленном будущем.