Изменение размера BitVec в z3 [Python] - PullRequest
0 голосов
/ 06 октября 2018

Мне нужно символизировать байтовую строку неизвестной длины в z3.Я вижу два варианта: символизировать каждый необходимый байт, затем конкатные байты, когда необходимо применить ограничения, или символизировать одну длинную строку байтов, извлекая части, когда необходимо применять ограничения.

Одна длинная строка байтов кажется более удобной, но этопотребуется изменить размер, когда потребуется больший объем данных.У z3 есть способ сделать это?

1 Ответ

0 голосов
/ 06 октября 2018

Ответ зависит от того, что именно вы подразумеваете под Изменить размер .

Если вы хотите, чтобы вы изменили размер существующей переменной битового вектора позжебыть чем-то другим;тогда ответ «нет».После того, как вы объявите переменную с определенным размером битового вектора (или любого другого типа), вы не сможете изменить ее позже.

Однако, если вы имеете в виду, можете ли вы создать новую переменную из старой;тогда да.

Расширение: Вы можете либо расширять знак, либо расширять ноль в зависимости от необходимости учесть числа дополнения 2 или битовые векторы без знака до любого нового большего размера.(Используйте Concat, чтобы расширить либо 0, либо знаковый бит оригинала. См. Здесь: https://z3prover.github.io/api/html/namespacez3py.html#a4dfadd3cb36aaa827c9202a949a506a4)

Чтобы уменьшить, вы можете использовать Extract: https://z3prover.github.io/api/html/namespacez3py.html#a40e9429ef16134a6d9914ecdc2182e8c, путем извлечения произвольногосегмент по мере необходимости.

Обратите внимание, что во всех случаях новый размер должен быть конкретно известен. В следующем потоке обсуждается, почему это так: Извлечение Z3 BitVec с использованием символьного высокого иlow Суть в том, что логика SMTLib Bitvector относится к битовым векторам фиксированного размера, и поэтому размеры должны быть конкретно известны (ничто не может быть символическим для размеров битовых векторов) во время компиляции.

НоЧтобы подчеркнуть исходную точку, расширение или сжатие битового вектора просто создает новый, имеющий то же значение, что и старое (символическое или иное), при условии, что это значение соответствует новому представлению (в противном случае вы получите усечение по модулю).) Но что более важно, исходная переменная и все выражения, которые зависят от do not , будут затронуты этим chАнж;вы просто создаете новый битвектор.В этом смысле изменение размера существующей переменной bitvector просто невозможно на земле SMT.

...