Пункт 1., который вы хотите сделать, является стилистической проблемой. Программа имеет смысл, даже если условия не являются исключительными. Лично, как автор инструментов статического анализа, я думаю, что пользователи получают достаточно ложных тревог, не пытаясь навязать им стиль (и поскольку другой программист намеренно писал бы перекрывающиеся условия, тому другому программисту, о чем вы просите, будет ложная тревога) , Тем не менее, есть инструменты, которые можно настроить: для одного из них вы можете написать правило, в котором говорится, что случаи должны быть эксклюзивными, когда эта конструкция встречается. И, как было предложено Джеффри, вы можете обернуть свой код в контексте, в котором вы вычисляете логическое условие, которое является истинным, если нет перекрытия, и вместо этого проверяйте это условие.
Пункт 2. не является проблемой стиля: вы хотите знать, может ли быть возбуждено исключение.
Проблема трудно в теории и на практике, поэтому инструменты обычно дают, по крайней мере один из правильности (никогда не предупредить, если есть проблема) или полноты (никогда не предупредит для не вопрос) , Если типы переменных были неограниченными целыми числами, теория вычислимости указала бы, что анализатор не может быть как правильным, так и полным и заканчиваться для всех входных программ. Но достаточно с теорией. Некоторые инструменты дают как правильность, так и полноту, и это не значит, что они тоже не полезны.
Пример правильного инструмента: Frama-C Анализ стоимости: если он говорит, что утверждение (например, последний случай в последовательности elseifs) недостижима, вы знаете, что оно недоступно. Это не полно, поэтому, когда он не говорит, что последнее утверждение недостижимо, вы не знаете.
Пример инструмента, который является полным является Cute: он использует так называемый concolic подхода для генерации тестовых случаев автоматически, с целью структурного покрытия (то есть, он будет более или менее эвристический пытается генерировать тесты, которые активизируют последние случай, когда все остальные были приняты). Поскольку он генерирует тестовые примеры (каждый отдельный, определенный входной вектор, на котором фактически выполняется код), он никогда не предупреждает об отсутствии проблем. Это то, что значит быть полным. Но он может не найти тестовый пример, который приведет к достижению последнего утверждения, даже если он есть: он неверен.
Вы знаете что-нибудь еще о состоянииXs? Если это все простые выражения, например, это даст другой ответ, чем если бы они были произвольными вызовами функций. –
Я бы очень хотел, чтобы он уточнил, означает ли тег «логическая логика», что x, y, z являются булевыми переменными (в этом случае существует 8 оценок этой тройки переменных: выполните исчерпывающую проверку!) Или, скажем, , неограниченные целые числа (в этом случае, как я прокомментировал, я уверен, что проблема неразрешима, что на практике не исключает полезных ответов). –