Ответ 1
Этот ответ более сфокусирован на аспекте теории вашего вопроса.
В основном вы делаете утверждение: "Эти методы работают только под определенными потоками". Это утверждение не сильно отличается от любого другого утверждения, которое вы можете сделать ( "Метод принимает только целые числа менее 17 для параметра X" ). Проблемы:
- Откуда берутся такие утверждения?
- Могут ли статические анализаторы проверить их?
- Где вы получаете такой статический анализатор?
В большинстве случаев такие утверждения должны исходить от разработчиков программного обеспечения, поскольку они - единственные люди, которые знают намерения. Традиционный термин для этого - "Дизайн по контракту", хотя большинство схем DBC находятся только над текущим состоянием программы (макрос C assert), и они действительно должны быть над прошлыми и будущими состояниями программ ( "временные утверждения" ), например, g., "Эта процедура будет выделять блок хранения, и в конечном итоге часть кода освободит его". Можно построить инструменты, которые пытаются определить hueristically, что такое утверждения (например, индукционная работа утверждения Engler, другие сделали работу в этой области). Это полезно, но ложные срабатывания являются проблемой. Как практический вопрос, просить дизайнеров кодировать такие утверждения не кажется особенно обременительным, и это действительно хорошая долгосрочная документация. Согласуете ли вы такие утверждения с конкретной конструкцией языка "Контракт" или с выражением if (если "Debug && Not (assertion) Then Fail();" ) или скрыть их в аннотации, это просто вопрос удобство. Приятно, когда язык позволяет напрямую кодировать такие утверждения.
Проверка таких утверждений статически сложна. Если вы придерживаетесь только текущего состояния, статический анализатор в значительной степени должен выполнять полный анализ потока данных всего вашего приложения, потому что информация, необходимая для подтверждения утверждения, может быть получена из данных, созданных другой частью приложения. (В вашем случае сигнал "внутри EDT" должен исходить от анализа всего графика вызовов приложения, чтобы увидеть, есть ли какой-либо путь вызова, который приводит к методу из потока, который НЕ является потоком EDT). Если вы используете временные свойства, статическая проверка в значительной степени нуждается в какой-то логике проверки состояния пространства; это в настоящее время все еще довольно много инструментов исследования. Даже со всем этим оборудованием статические анализаторы обычно должны быть "консервативными" в своих анлейсах; если они не могут продемонстрировать, что что-то ложно, они в значительной степени должны предположить, что это правда, из-за проблемы с остановкой.
Где вы получаете такие анализаторы? Учитывая все необходимое оборудование, их сложно построить, и поэтому вы должны ожидать, что они будут редкими. Если кто-то построил один, великий. Если нет... как правило, вы не хотите делать это сами с нуля. Лучшая долгосрочная надежда состоит в том, чтобы иметь общий механизм анализа программ, на котором можно построить такие анализаторы, чтобы амортизировать затраты на строительство всей инфраструктуры. (Я создаю основы инструмента анализатора программ, см. наш DMS Software Reengineering Toolkit).
Один из способов упростить создание таких статических анализаторов - это ограничить случаи, в которых они обрабатывают узкие области видимости, например, CheckThread. Я бы ожидал, что CheckThread сделает то, что в настоящее время делает, и вряд ли это станет намного сильнее.
Причиной того, что макросы "утверждать" и другие подобные динамические проверки "текущего состояния" пользуются популярностью, является то, что они действительно могут быть реализованы простым тестом во время выполнения. Это довольно практично. Проблема здесь в том, что вы никогда не сможете использовать путь, который приведет к неудачным условиям. Таким образом, для динамического анализа отсутствие обнаруженного отказа на самом деле не свидетельствует о правильности. Все еще чувствует себя хорошо.
Нижняя линия: статические анализаторы и динамические анализаторы имеют свою силу.