Перейти к основному содержимому
Разделы документации

SWIFT ANALYZER / КАТАЛОГ

Проблема. Доказательство. Исправление.

138 правил о поведении Swift-программ. От устаревшего состояния после await до лишних обходов коллекции и утечки секрета в лог.

138 правил141 условие33 принято в узких областях10 направлений

Найдено правил: 138 · условий: 141

ARCHПринят subset

Production-код используется только тестами

architecture.production-used-only-by-tests@1.0.0

Тесты могут сохранять видимость востребованности API, который больше не нужен поставляемому приложению. Но тестовая поддержка сама по себе не ошибка.

V-ARCH-02Нарушение контракта
ARCHПринят subset

Запрещённая зависимость или обход слоя

architecture.forbidden-dependency@1.0.0

Прямой вызов через запрещённую границу делает слои зависимыми от внутренних деталей и затрудняет замену компонентов.

V-ARCH-03Нарушение контракта
ARCHПринят subset

Избыточная доступность API

api.access-narrowing@1.0.0

Лишняя публичность создаёт обязательства совместимости и позволяет внешнему коду зависеть от деталей реализации.

V-ARCH-04Возможность улучшения
ARCHПринят subset

Лишняя product dependency

architecture.unused-product-dependency@1.0.0

Лишняя product dependency расширяет граф сборки и поддержки. Для удаления нужно исключить не только вызовы, но и линковку, ресурсы и регистрацию.

V-ARCH-05Возможность улучшения
ARCHПринят subset

Необъявленный прямой provider

architecture.undeclared-direct-provider@1.0.0

Код может случайно компилироваться через транзитивную зависимость и ломаться после безобидного изменения промежуточного пакета.

V-ARCH-06Нарушение контракта
ARCHПринят subset

Недопустимый цикл компонентов

architecture.dependency-cycle@1.0.0

Запрещённый цикл связывает жизненный цикл компонентов и мешает независимой сборке или изменению. Цикл важен относительно политики, а не сам по себе.

V-ARCH-07Нарушение контракта
ARCHПринят subset

Утечка implementation type через API

api.implementation-type-leakage@1.0.0

Внутренний тип в публичной сигнатуре заставляет пользователей API знать о реализации и может нарушать границы модулей.

V-ARCH-08Нарушение контракта
ARCHПринят subset

Несовместимая регистрация или entry point

architecture.registration-contract-mismatch@1.0.0

Runtime-регистрация может ссылаться на несовместимый класс или точку входа, даже когда обычные вызовы выглядят корректно.

V-ARCH-09Дефект
ARCHПринят subset

Неиспользуемый параметр во всём dispatch family

portfolio.arch.11@1.0.0

Параметр без семантической роли усложняет API и вводит вызывающий код в заблуждение. Виртуальные и protocol-вызовы требуют проверки всей семьи реализаций.

V-ARCH-11Возможность улучшения
ARCHПринят subset

Свойство только записывается и не наблюдается

portfolio.arch.12@1.0.0

Запись в свойство может создавать впечатление сохранённого состояния, хотя это состояние никогда не наблюдается. Но сама запись иногда имеет важный эффект lifetime.

V-ARCH-12Возможность улучшения
ARCHПринят subset

Избыточный протокол или conformance

portfolio.arch.13@1.0.0

Conformance может быть частью dispatch или framework-контракта без очевидного вызова метода. Удалять его допустимо только при отсутствии всех значимых ролей.

V-ARCH-13Возможность улучшения
ARCHПринят subset

Семантически лишний import

portfolio.arch.14@1.0.0

Import меняет доступный набор extensions и overloads. Успешная компиляция после удаления ещё не означает сохранение привязок вызовов.

V-ARCH-14Возможность улучшения
EXECТребует восстановления

Вызов через несовместимую изоляцию

concurrency.incompatible-isolation@1.0.0

Код обращается к состоянию из контекста, которому это состояние не принадлежит. Особенно опасны границы legacy API, скрывающие изоляцию от компилятора.

V-EXEC-01Дефект
EXECТребует восстановления

Вход в MainActor без доказанного контекста

concurrency.unproven-mainactor-entry@1.0.0

Внешняя точка входа может вызывать UI-код без проверенного контракта MainActor. Это повод проверить границу, а не автоматически объявить гонку.

V-EXEC-02Сигнал для review
EXECТребует восстановления

Потеря требуемого контекста при detachment

concurrency.detached-task-context-loss@1.0.0

Detached-задача не наследует actor isolation и task-local значения так же, как обычная Task. Потеря нужного контекста может изменить поведение.

V-EXEC-03Нарушение контракта
EXECТребует восстановления

Недопустимое предположение об изоляции

portfolio.exec.05@1.0.0

assumeIsolated утверждает уже существующую изоляцию, но не переключает executor. Ложное утверждение приводит к аварии или нарушению контракта.

V-EXEC-05Дефект
EXECТребует восстановления

Ресурс используется вне своего execution domain

portfolio.exec.06@1.0.0

Некоторые ресурсы принадлежат определённой очереди, event loop или контексту. Общая потокобезопасность языка не отменяет их собственного контракта.

V-EXEC-06Дефект
EXECТребует восстановления

Thread-affine значение переживает suspension

portfolio.exec.07@1.0.0

После await задача может продолжиться на другом потоке даже при сохранённой actor isolation. Thread-local ресурс нельзя считать автоматически сохранённым.

V-EXEC-07Дефект
EXECТребует восстановления

Потеря требуемого task-local или executor preference

portfolio.exec.08@1.0.0

Адаптер задачи может потерять task-local значение или необходимое предпочтение executor, на которое опирается вызываемый код.

V-EXEC-08Нарушение контракта
EXECТребует восстановления

Blocking-вызов на критическом executor

concurrency.main-actor-blocking@1.0.0

Блокирующая операция занимает executor и мешает обслуживать другие задачи; на MainActor это проявляется зависанием UI.

V-EXEC-09Нарушение контракта
EXECТребует восстановления

Устранимая scheduling boundary

portfolio.exec.11@1.0.0

Лишняя граница планирования добавляет задержку и меняет порядок событий. Удалять её можно лишь при сохранении наблюдаемой семантики.

V-EXEC-11Возможность улучшения
EXECТребует восстановления

Усиление стоимости из-за actor crossings

portfolio.exec.12@1.0.0

Поэлементные обращения к actor многократно оплачивают переход и открывают промежутки для interleaving. Пакетный метод иногда дешевле и точнее выражает операцию.

V-EXEC-12Возможность улучшения
EXECТребует восстановления

Нарушена сериализация custom SerialExecutor

portfolio.exec.14@1.0.0

Custom SerialExecutor обязан исключать одновременное исполнение своих jobs. Нарушение делает обещанную actor isolation недействительной.

V-EXEC-14Дефект
ASYNCТребует восстановления

Проверка состояния устарела после await

concurrency.state-freshness-across-suspension@1.0.0

Проверка состояния до await может устареть: actor допускает другие обращения во время suspension.

V-ASYNC-01Дефект
ASYNCТребует восстановления

Нарушенный инвариант виден во время suspension

concurrency.actor-invariant-exposure@1.0.0

Если инвариант восстановится только после await, другой вызов actor может увидеть промежуточное некорректное состояние.

V-ASYNC-02Дефект
ASYNCТребует восстановления

Continuation остаётся без resume

concurrency.lost-continuation-resume@1.0.0

Не возобновлённая continuation навсегда оставляет ожидающую задачу suspended. Типичный источник — пропущенная ветка ошибки.

V-ASYNC-06Дефект
ASYNCТребует восстановления

Continuation возобновляется повторно

concurrency.double-continuation-resume@1.0.0

Continuation должна возобновляться ровно один раз. Конкурирующие success, timeout и cancellation легко нарушают это условие.

V-ASYNC-07Дефект
ASYNCТребует восстановления

Cancellation теряется между registration и start

concurrency.cancel-register-start-race@1.0.0

Отмена может прийти до регистрации handle. Если её обработчик видит nil, операция позже запустится без возможности отмены.

V-ASYNC-08Дефект
ASYNCТребует восстановления

Запрещённый commit после отмены или отказа

concurrency.cancelled-forbidden-effect@1.0.0

После отмены или отзыва разрешения задача может продолжить работу и выполнить запрещённую запись.

V-ASYNC-09Дефект
ASYNCТребует восстановления

Работа не соблюдает cancellation contract

concurrency.unresponsive-cancellation-work@1.0.0

Cancellation в Swift кооперативна: длительная работа без проверок продолжает расходовать ресурсы после отмены.

V-ASYNC-10Нарушение контракта
ASYNCТребует восстановления

Timeout или first-result не завершает scope по контракту

concurrency.timeout-sibling-outlives-race@1.0.0

Возврат первого результата из task group не завершает scope, пока не завершились остальные children. Timeout может оказаться фиктивным.

V-ASYNC-11Дефект
ASYNCТребует восстановления

Task переживает обязательный lifecycle scope

concurrency.task-outlives-scope@1.0.0

Неструктурированная задача может пережить экран, запрос или сервис, для которого она создавалась.

V-ASYNC-12Нарушение контракта
ASYNCТребует восстановления

Guard удерживается через недопустимый await

concurrency.guard-held-across-suspension@1.0.0

Удержание lock или аналогичного guard через await мешает прогрессу других задач и может нарушить требования привязки к потоку.

V-ASYNC-14Дефект
ASYNCТребует восстановления

Цикл ожиданий блокирует обязательных producers

concurrency.sole-producer-self-block@1.0.0

Цикл ожиданий делает прогресс невозможным: каждый участник ждёт события, которое может произвести только другой участник цикла.

V-ASYNC-15Дефект
ASYNCТребует восстановления

Priority inversion через непрозрачное ожидание

portfolio.async.17@1.0.0

Высокоприоритетная задача может ждать низкоприоритетную работу через непрозрачный bridge без нужного механизма donation или ограничения задержки.

V-ASYNC-17Возможность улучшения
ASYNCТребует восстановления

Custom executor теряет или повторяет job

portfolio.async.20@1.0.0

Executor должен доставить каждый принятый job ровно один раз. Потеря зависает задачу, повторное исполнение нарушает runtime-контракт.

V-ASYNC-20Дефект
LIFEТребует восстановления

Borrowed pointer или view выходит за lifetime

lifetime.escaping-value@1.0.0

Указатель на временно заимствованную память становится недействительным за пределами области borrow, даже если его тип позволяет сохранить адрес.

V-LIFE-01Дефект
LIFEТребует восстановления

Использование освобождённой памяти

portfolio.life.02@1.0.0

Освобождение памяти не обнуляет все её aliases. Последующее чтение через любой alias использует уже недействительный ресурс.

V-LIFE-02Дефект
LIFEТребует восстановления

Повторное или несовместимое освобождение

portfolio.life.03@1.0.0

Повторное освобождение или несовместимая пара allocator/deallocator повреждает память. Совпадение типов указателей не доказывает совместимость.

V-LIFE-03Дефект
LIFEТребует восстановления

Unowned-доступ после смерти owner

portfolio.life.04@1.0.0

unowned не удерживает объект живым. Если callback переживает владельца, обращение приводит к аварии.

V-LIFE-04Дефект
LIFEТребует восстановления

Нарушение Unmanaged ownership balance

lifetime.unmanaged-ownership-balance@1.0.0

Unmanaged переносит ответственность за retain/release на код. Несбалансированная передача приводит к утечке или преждевременному освобождению.

V-LIFE-05Дефект
LIFEТребует восстановления

Registration переживает допустимую область

lifetime.registration-outlives-scope@1.0.0

Observer, таймер или подписка продолжает получать события после завершения области, которой он принадлежит.

V-LIFE-08Нарушение контракта
LIFEТребует восстановления

Не выполнена cleanup obligation

lifetime.undischarged-resource-obligation@1.0.0

Ошибка или ранний return может пропустить обязательное закрытие файла, дескриптора или другого ресурса.

V-LIFE-09Дефект
LIFEТребует восстановления

Pointer/count выходит за допустимую область

correctness.pointer-count-initialization@1.0.0

Адрес может быть действительным, но переданный count выходит за доступный или инициализированный диапазон.

V-LIFE-12Дефект
PERFТребует восстановления

Повторный линейный проход / Повторно вычисляется lazy pipeline

performance.repeated-linear-traversal@1.0.0

Линейный поиск внутри цикла превращает обработку двух коллекций в произведение их размеров. При подходящей семантике индекс строится один раз.

V-PERF-01 · V-PERF-05Возможность улучшения
PERFТребует восстановления

Повторная инвариантная сортировка

performance.repeated-sorting@1.0.0

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

V-PERF-02Возможность улучшения
PERFТребует восстановления

Повторная потребляемая materialization / Материализация растущего префикса

performance.repeated-consumed-materialization@1.0.0

Материализация полностью потребляемого промежуточного результата на каждом шаге может многократно копировать растущий объём данных.

V-PERF-03 · V-PERF-11Возможность улучшения
PERFТребует восстановления

Array используется как растущая FIFO со сдвигами

performance.array-fifo-shifts@1.0.0

Удаление первого элемента Array сдвигает оставшийся хвост. Повторение до опустошения даёт квадратичную работу.

V-PERF-04Возможность улучшения
PERFТребует восстановления

Полная сортировка для extremum или top-k

portfolio.perf.06@1.0.0

Полная сортировка требует больше работы, чем поиск одного экстремума; для малого top-k тоже существуют специализированные алгоритмы.

V-PERF-06Возможность улучшения
PERFТребует восстановления

Дорогая проекция повторяется в comparator

performance.comparator-projection-amplification@1.0.0

Comparator вызывается многократно, поэтому дорогая проекция внутри него может доминировать над самой сортировкой.

V-PERF-07Возможность улучшения
PERFТребует восстановления

Eager materialization перед коротким consumer

portfolio.perf.08@1.0.0

Eager map вычисляет весь набор, хотя downstream потребляет лишь небольшой prefix.

V-PERF-08Возможность улучшения
PERFТребует восстановления

Повторный физический CoW detach

portfolio.perf.09@1.0.0

Изменение разделяемого CoW-буфера может физически скопировать весь storage. Частые snapshots перед мутацией делают стоимость неожиданной.

V-PERF-09Возможность улучшения
PERFТребует восстановления

Get-copy-modify-set усиливает стоимость

portfolio.perf.10@1.0.0

Getter, локальная мутация и setter могут извлекать и возвращать большую коллекцию на каждом шаге вместо изменения на месте.

V-PERF-10Возможность улучшения
PERFТребует восстановления

Capacity policy нарушает амортизированную границу

portfolio.perf.12@1.0.0

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

V-PERF-12Возможность улучшения
PERFТребует восстановления

Повторное поэлементное bridging

portfolio.perf.13@1.0.0

Поэлементные переходы между представлениями Swift и Objective-C могут повторять boxing, allocation или conversion.

V-PERF-13Возможность улучшения
PERFТребует восстановления

Повторная дорогая hash/equality работа

portfolio.perf.14@1.0.0

Дорогой hash или equality многократно исполняется при lookup и может скрыть линейную или более высокую стоимость за API словаря.

V-PERF-14Возможность улучшения
PERFТребует восстановления

Маленький slice удерживает большую storage

portfolio.perf.15@1.0.0

Маленький slice может удерживать большой backing storage значительно дольше, чем ожидает вызывающий код.

V-PERF-15Возможность улучшения
SECТребует восстановления

Чувствительные данные попадают в логи / Чувствительные данные достигают запрещённого получателя

security.sensitive-data-flow@1.0.0

Секрет, попавший в лог, может стать доступен гораздо более широкому кругу систем и людей, чем исходное хранилище.

V-SEC-01 · V-SEC-02Дефект / Нарушение контракта
SECТребует восстановления

SQL injection

security.sql-structure-injection@1.0.0

Интерполяция недоверенного значения в SQL смешивает данные и структуру запроса.

V-SEC-03Дефект
SECТребует восстановления

Shell injection

security.shell-command-injection@1.0.0

Передача недоверенного текста оболочке позволяет интерпретировать его как команды и операторы.

V-SEC-04Дефект
SECТребует восстановления

Format-string injection

security.format-position-injection@1.0.0

Недоверенная format string управляет интерпретацией аргументов, а в низкоуровневых API может нарушить безопасность памяти.

V-SEC-05Дефект
SECТребует восстановления

Path traversal / выход из extraction root

security.path-traversal@1.0.0

Имя файла из архива может вывести запись за каталог назначения через .., абсолютный путь или symlink.

V-SEC-06Дефект
SECТребует восстановления

JS/HTML context injection

security.javascript-code-injection@1.0.0

Недоверенный текст в HTML или JavaScript может стать исполняемым кодом вместо содержимого.

V-SEC-07Дефект
SECТребует восстановления

Predicate injection

portfolio.sec.09@1.0.0

Формирование predicate из строки с пользовательским вводом позволяет изменить структуру условия.

V-SEC-09Дефект
SECТребует восстановления

Regex injection

portfolio.sec.10@1.0.0

Недоверенное значение внутри regex меняет смысл поиска: данные становятся метасимволами регулярного выражения.

V-SEC-10Дефект
SECТребует восстановления

Алгоритмический DoS через regex

portfolio.sec.11@1.0.0

Некоторые regex на специально подобранном длинном вводе требуют чрезмерного backtracking и блокируют обработчик.

V-SEC-11Дефект
SECТребует восстановления

External-entity expansion из недоверенного XML

portfolio.sec.12@1.0.0

Разрешённые внешние XML entities могут читать локальные файлы или выполнять нежелательные сетевые обращения.

V-SEC-12Дефект
SECТребует восстановления

Проверка TLS trust фактически отключена

portfolio.sec.13@1.0.0

Безусловное принятие сертификата убирает проверку подлинности сервера, хотя соединение выглядит зашифрованным.

V-SEC-13Дефект
SECТребует восстановления

Повтор ключевого nonce/IV в недопустимом режиме

portfolio.sec.15@1.0.0

Повтор nonce с одним ключом может разрушить гарантии схемы шифрования. Постоянная строка nonce особенно опасна при нескольких сообщениях.

V-SEC-15Дефект
SECТребует восстановления

Небезопасный password derivation contract

portfolio.sec.16@1.0.0

Быстрый или слишком дешёвый password derivation делает перебор украденной базы практичнее.

V-SEC-16Дефект
SECТребует восстановления

Обход security validator или sanitizer

portfolio.sec.20@1.0.0

Значение может попасть к чувствительной операции по обходному пути, не проходящему обязательную проверку.

V-SEC-20Дефект
SECТребует восстановления

Встроенный секрет достигает security use

portfolio.sec.21@1.0.0

Встроенный в shipping-продукт секрет доступен получателю бинарника и не может считаться серверной границей доверия.

V-SEC-21Дефект
SECТребует восстановления

WebView получает запрещённые возможности

portfolio.sec.22@1.0.0

WebView, показывающий недоверенное содержимое, может получить bridge или доступы, предназначенные только доверенной странице.

V-SEC-22Нарушение контракта
SECТребует восстановления

Невоспроизводимый dependency resolution нарушает policy

portfolio.sec.25@1.0.0

Неопределённое разрешение зависимостей делает одну версию проекта зависимой от времени сборки и внешних изменений.

V-SEC-25Нарушение контракта
SECТребует восстановления

Отладочная возможность доступна в shipping product

portfolio.sec.26@1.0.0

Debug endpoint или обход проверки, попавший в shipping-вариант, открывает возможности, предназначенные только разработчику.

V-SEC-26Нарушение контракта
CORПринят subset

Equality и hashing противоречат друг другу

correctness.equality-hash-contract@1.0.0

Set и Dictionary предполагают согласованность equality и hashing. Если равные значения получают разные хеш-входы, membership может вести себя неожиданно.

V-COR-01Дефект
CORПринят subset

Ключ меняет equality/hash во время membership

correctness.mutable-collection-key@1.0.0

Мутация поля, участвующего в equality/hash, пока объект находится в Set или ключах Dictionary, ломает предположения membership.

V-COR-05Дефект
CORПринят subset

Нарушены законы ordering

correctness.bounded-ordering-law@1.0.0

Алгоритм сортировки требует определённых законов сравнения. Их нарушение может давать нестабильный или неверный результат.

V-COR-06Дефект
CORПринят subset

Записанное значение теряется до наблюдения

portfolio.cor.14@1.0.0

Значение вычислено и записано, но до любого наблюдения заменено другим. Это может быть пропущенное использование или лишняя работа.

V-COR-14Возможность улучшения
CORПринят subset

Участок управления недостижим

portfolio.cor.17@1.0.0

Недостижимая ветвь может указывать на потерянный сценарий обработки или устаревшее предположение о входе.

V-COR-17Дефект
STREAMТребует восстановления

Конкурентный next у single-consumer iterator

portfolio.stream.03@1.0.0

Одновременные next на одном iterator могут нарушать его контракт и приводить к потере или неправильной доставке элементов.

V-STREAM-03Дефект
STREAMТребует восстановления

Retry/refresh образует цикл без progress/budget

portfolio.stream.05@1.0.0

Retry без прогресса, лимита или backoff может бесконечно нагружать сервис и удерживать задачу.

V-STREAM-05Нарушение контракта
STREAMТребует восстановления

Повтор non-idempotent операции дублирует effect

portfolio.stream.06@1.0.0

Повтор операции после неясного сетевого исхода может применить её дважды, даже если первый ответ не был получен.

V-STREAM-06Дефект
UIТребует восстановления

Вычисление представления вызывает цикл state updates

portfolio.ui.03@1.0.0

Изменение состояния во время вычисления зависимого представления может запускать повторные обновления без достижения устойчивого состояния.

V-UI-03Дефект
CHANGEТребует восстановления

Source API change ломает допустимого consumer

portfolio.change.01@1.0.0

Изменение публичного API может сломать исходный код разрешённых consumers, хотя сама библиотека успешно собирается.

V-CHANGE-01Дефект
CHANGEТребует восстановления

ABI change нарушает binary compatibility

portfolio.change.02@1.0.0

Бинарный consumer может стать несовместим с новой библиотекой без перекомпиляции, даже когда исходники выглядят похожими.

V-CHANGE-02Дефект
CHANGEТребует восстановления

Version range допускает несовместимый provider

portfolio.change.05@1.0.0

Разрешённый version range может включать версию зависимости, с которой consumer несовместим.

V-CHANGE-05Нарушение контракта
CHANGEТребует восстановления

Изменение обходит обязательный consumer review

portfolio.change.06@1.0.0

Изменение может обойти обязательную проверку затронутых consumers из-за неполной карты impact или ошибочного gate.

V-CHANGE-06Нарушение контракта
CHANGEТребует восстановления

Ухудшилась сопоставимая граница ресурса

portfolio.change.07@1.0.0

Изменение может ухудшить гарантированную стоимость памяти или времени на сопоставимых входах, даже при сохранённом результате.

V-CHANGE-07Возможность улучшения

Один RuleID может объединять несколько условий. Вид результата не задаёт severity, а стратегия первого результата не означает готовность. Обзор направлений →