внутри циклов? В статьях, которые гуглятся, почему-то этого места не касаются.
А если делать поверх АСТ? Вроде бы можно, через подпрыгиваение же?
Во-первых, это зависит от решётки, в которой Вы работаете, а во-вторых — в чём конкретно вопрос? Или какой неправильный способ их джойнить (в отличие от джойна if-then-else)?
Если такое не в цикле, и какая-то из веток терминируется (например else), то мы берем то что было в оставшейся (then) Если же у нас к примеру такое for (;;) { if (c) { x = 10 } else { x= 20; continue/break } use(x) // 1 } use (x) // 2 То что должно быть в 1 и 2 для x?
> Если такое не в цикле, и какая-то из веток терминируется (например else), то мы берем то что было в оставшейся (then) Вот этого я не понял, что значит "берем то что было в оставшейся"? Какой именно анализ Вы делаете и в какой решётке? > То что должно быть в 1 и 2 для x? Та от решётки же зависит, может быть просто Number, например...
Решетка, видимо, символьная (выражение)
Символьные тоже разные бывают. Без конкретики я не знаю, что Вам ответить...
Во-первых, 1, 2, 3, ..., Number тоже можно обозвать "символьной", потому что Number. Во-вторых, можно символьно использовать выражения того же самого языка, а можно другого. В-третьих, можно в символьные выражения ещё включать условия, а можно не включать. Это то, что из головы, и я символьными непосредственно не занимался, специалисты, поди, больше оттенков различают...
У меня в качестве символов используются выражения ast и есть флаги которые выводятся из проверок
Ну да
Z3, CVC4 плюс ещё по мелочи...
Тогда результат блока с continue должен пропагироваться в начало цикла(в проверку условия), а результат блока с break должен пропагироваться в конец цикла (в statement непосредственно после цикла) Или по-другому, нужно предшественниками условия цикла сделать не только прехедер и конец цикла, но все блоки с continue (для этого цикла). Break похожим образом делается
И правильно ли я понимаю, что каскадные условия (&& и ||) тоже декомпозируются в набор блоков с понятными входами и выходами
В целом, для них можно не хранить информацию о состоянии анализа - просто линейно пробегаться, как по if. Хранить информацию, вроде, достаточно только для блоков, тел цикла(с учётом условия) и goto-таргетов
Обсуждают сегодня