Неиспользуемая декларация или группа деклараций
repository-unused@1.0.0Неиспользуемый код увеличивает поверхность изменений: его продолжают читать, переносить и поддерживать, хотя он не участвует в работе продукта.
SWIFT ANALYZER / КАТАЛОГ
138 правил о поведении Swift-программ. От устаревшего состояния после await до лишних обходов коллекции и утечки секрета в лог.
Найдено правил: 138 · условий: 141
repository-unused@1.0.0Неиспользуемый код увеличивает поверхность изменений: его продолжают читать, переносить и поддерживать, хотя он не участвует в работе продукта.
architecture.production-used-only-by-tests@1.0.0Тесты могут сохранять видимость востребованности API, который больше не нужен поставляемому приложению. Но тестовая поддержка сама по себе не ошибка.
architecture.forbidden-dependency@1.0.0Прямой вызов через запрещённую границу делает слои зависимыми от внутренних деталей и затрудняет замену компонентов.
api.access-narrowing@1.0.0Лишняя публичность создаёт обязательства совместимости и позволяет внешнему коду зависеть от деталей реализации.
architecture.unused-product-dependency@1.0.0Лишняя product dependency расширяет граф сборки и поддержки. Для удаления нужно исключить не только вызовы, но и линковку, ресурсы и регистрацию.
architecture.undeclared-direct-provider@1.0.0Код может случайно компилироваться через транзитивную зависимость и ломаться после безобидного изменения промежуточного пакета.
architecture.dependency-cycle@1.0.0Запрещённый цикл связывает жизненный цикл компонентов и мешает независимой сборке или изменению. Цикл важен относительно политики, а не сам по себе.
api.implementation-type-leakage@1.0.0Внутренний тип в публичной сигнатуре заставляет пользователей API знать о реализации и может нарушать границы модулей.
architecture.registration-contract-mismatch@1.0.0Runtime-регистрация может ссылаться на несовместимый класс или точку входа, даже когда обычные вызовы выглядят корректно.
portfolio.arch.10@1.0.0Обязательный lookup отсутствующего ресурса приводит к неработающему пути или аварийному unwrap. Это проверяется относительно состава конкретной сборки.
portfolio.arch.11@1.0.0Параметр без семантической роли усложняет API и вводит вызывающий код в заблуждение. Виртуальные и protocol-вызовы требуют проверки всей семьи реализаций.
portfolio.arch.12@1.0.0Запись в свойство может создавать впечатление сохранённого состояния, хотя это состояние никогда не наблюдается. Но сама запись иногда имеет важный эффект lifetime.
portfolio.arch.13@1.0.0Conformance может быть частью dispatch или framework-контракта без очевидного вызова метода. Удалять его допустимо только при отсутствии всех значимых ролей.
portfolio.arch.14@1.0.0Import меняет доступный набор extensions и overloads. Успешная компиляция после удаления ещё не означает сохранение привязок вызовов.
concurrency.incompatible-isolation@1.0.0Код обращается к состоянию из контекста, которому это состояние не принадлежит. Особенно опасны границы legacy API, скрывающие изоляцию от компилятора.
concurrency.unproven-mainactor-entry@1.0.0Внешняя точка входа может вызывать UI-код без проверенного контракта MainActor. Это повод проверить границу, а не автоматически объявить гонку.
concurrency.detached-task-context-loss@1.0.0Detached-задача не наследует actor isolation и task-local значения так же, как обычная Task. Потеря нужного контекста может изменить поведение.
concurrency.dispatch-isolation-mismatch@1.0.0Scheduler callback и изоляция его тела могут расходиться. Название очереди или нахождение рядом с MainActor не доказывает корректность.
portfolio.exec.05@1.0.0assumeIsolated утверждает уже существующую изоляцию, но не переключает executor. Ложное утверждение приводит к аварии или нарушению контракта.
portfolio.exec.06@1.0.0Некоторые ресурсы принадлежат определённой очереди, event loop или контексту. Общая потокобезопасность языка не отменяет их собственного контракта.
portfolio.exec.07@1.0.0После await задача может продолжиться на другом потоке даже при сохранённой actor isolation. Thread-local ресурс нельзя считать автоматически сохранённым.
portfolio.exec.08@1.0.0Адаптер задачи может потерять task-local значение или необходимое предпочтение executor, на которое опирается вызываемый код.
concurrency.main-actor-blocking@1.0.0Блокирующая операция занимает executor и мешает обслуживать другие задачи; на MainActor это проявляется зависанием UI.
portfolio.exec.10@1.0.0Длительная CPU-работа на критическом executor задерживает все обслуживаемые им события даже без блокирующих системных вызовов.
portfolio.exec.11@1.0.0Лишняя граница планирования добавляет задержку и меняет порядок событий. Удалять её можно лишь при сохранении наблюдаемой семантики.
portfolio.exec.12@1.0.0Поэлементные обращения к actor многократно оплачивают переход и открывают промежутки для interleaving. Пакетный метод иногда дешевле и точнее выражает операцию.
portfolio.exec.13@1.0.0Последовательные await могут случайно сериализовать независимые операции и увеличить время ответа до суммы задержек.
portfolio.exec.14@1.0.0Custom SerialExecutor обязан исключать одновременное исполнение своих jobs. Нарушение делает обещанную actor isolation недействительной.
concurrency.state-freshness-across-suspension@1.0.0Проверка состояния до await может устареть: actor допускает другие обращения во время suspension.
concurrency.actor-invariant-exposure@1.0.0Если инвариант восстановится только после await, другой вызов actor может увидеть промежуточное некорректное состояние.
concurrency.obsolete-generation-commit@1.0.0Ответ старого запроса может перезаписать результат нового, хотя оба обращения к памяти корректно изолированы.
portfolio.async.04@1.0.0Проверка кэша с последующим await позволяет нескольким callers одновременно запустить одну дорогую операцию.
portfolio.async.05@1.0.0Actor сериализует отдельные участки исполнения, но не обещает FIFO завершения произвольных задач.
concurrency.lost-continuation-resume@1.0.0Не возобновлённая continuation навсегда оставляет ожидающую задачу suspended. Типичный источник — пропущенная ветка ошибки.
concurrency.double-continuation-resume@1.0.0Continuation должна возобновляться ровно один раз. Конкурирующие success, timeout и cancellation легко нарушают это условие.
concurrency.cancel-register-start-race@1.0.0Отмена может прийти до регистрации handle. Если её обработчик видит nil, операция позже запустится без возможности отмены.
concurrency.cancelled-forbidden-effect@1.0.0После отмены или отзыва разрешения задача может продолжить работу и выполнить запрещённую запись.
concurrency.unresponsive-cancellation-work@1.0.0Cancellation в Swift кооперативна: длительная работа без проверок продолжает расходовать ресурсы после отмены.
concurrency.timeout-sibling-outlives-race@1.0.0Возврат первого результата из task group не завершает scope, пока не завершились остальные children. Timeout может оказаться фиктивным.
concurrency.task-outlives-scope@1.0.0Неструктурированная задача может пережить экран, запрос или сервис, для которого она создавалась.
portfolio.async.13@1.0.0Потерянный handle throwing Task может скрыть ошибку обязательной операции: вызывающая сторона считает работу успешной.
concurrency.guard-held-across-suspension@1.0.0Удержание lock или аналогичного guard через await мешает прогрессу других задач и может нарушить требования привязки к потоку.
concurrency.sole-producer-self-block@1.0.0Цикл ожиданий делает прогресс невозможным: каждый участник ждёт события, которое может произвести только другой участник цикла.
portfolio.async.16@1.0.0Синхронное ожидание внутри cooperative pool может занять все потоки, необходимые задаче-производителю.
portfolio.async.17@1.0.0Высокоприоритетная задача может ждать низкоприоритетную работу через непрозрачный bridge без нужного механизма donation или ограничения задержки.
portfolio.async.18@1.0.0Unsafe Sendable или legacy-граница может скрыть общую изменяемую память от проверок компилятора.
portfolio.async.19@1.0.0Callback может быть синхронным и повторно войти в объект до завершения инициализации или регистрации операции.
portfolio.async.20@1.0.0Executor должен доставить каждый принятый job ровно один раз. Потеря зависает задачу, повторное исполнение нарушает runtime-контракт.
lifetime.escaping-value@1.0.0Указатель на временно заимствованную память становится недействительным за пределами области borrow, даже если его тип позволяет сохранить адрес.
portfolio.life.02@1.0.0Освобождение памяти не обнуляет все её aliases. Последующее чтение через любой alias использует уже недействительный ресурс.
portfolio.life.03@1.0.0Повторное освобождение или несовместимая пара allocator/deallocator повреждает память. Совпадение типов указателей не доказывает совместимость.
portfolio.life.04@1.0.0unowned не удерживает объект живым. Если callback переживает владельца, обращение приводит к аварии.
lifetime.unmanaged-ownership-balance@1.0.0Unmanaged переносит ответственность за retain/release на код. Несбалансированная передача приводит к утечке или преждевременному освобождению.
lifetime.ownership-cycle@1.0.0Цикл сильных ссылок не даёт владельцам освободиться, если нет внешнего механизма разрыва.
portfolio.life.07@1.0.0Weak-ссылка может исчезнуть раньше обязательной операции. Это обратная сторона механического устранения retain cycles.
lifetime.registration-outlives-scope@1.0.0Observer, таймер или подписка продолжает получать события после завершения области, которой он принадлежит.
lifetime.undischarged-resource-obligation@1.0.0Ошибка или ранний return может пропустить обязательное закрытие файла, дескриптора или другого ресурса.
portfolio.life.10@1.0.0После close или передачи владения прежний handle больше нельзя использовать даже при сохранённом значении переменной.
portfolio.life.11@1.0.0Выделенная память ещё не содержит инициализированных значений Swift. Чтение до initialize нарушает контракт хранения.
correctness.pointer-count-initialization@1.0.0Адрес может быть действительным, но переданный count выходит за доступный или инициализированный диапазон.
performance.repeated-linear-traversal@1.0.0Линейный поиск внутри цикла превращает обработку двух коллекций в произведение их размеров. При подходящей семантике индекс строится один раз.
performance.repeated-sorting@1.0.0Одинаковая сортировка неизменного набора внутри цикла повторяет работу, которую можно выполнить один раз.
performance.repeated-consumed-materialization@1.0.0Материализация полностью потребляемого промежуточного результата на каждом шаге может многократно копировать растущий объём данных.
performance.array-fifo-shifts@1.0.0Удаление первого элемента Array сдвигает оставшийся хвост. Повторение до опустошения даёт квадратичную работу.
portfolio.perf.06@1.0.0Полная сортировка требует больше работы, чем поиск одного экстремума; для малого top-k тоже существуют специализированные алгоритмы.
performance.comparator-projection-amplification@1.0.0Comparator вызывается многократно, поэтому дорогая проекция внутри него может доминировать над самой сортировкой.
portfolio.perf.08@1.0.0Eager map вычисляет весь набор, хотя downstream потребляет лишь небольшой prefix.
portfolio.perf.09@1.0.0Изменение разделяемого CoW-буфера может физически скопировать весь storage. Частые snapshots перед мутацией делают стоимость неожиданной.
portfolio.perf.10@1.0.0Getter, локальная мутация и setter могут извлекать и возвращать большую коллекцию на каждом шаге вместо изменения на месте.
portfolio.perf.12@1.0.0Неудачная стратегия capacity может разрушить амортизированную стоимость роста, особенно в собственных контейнерах или при повторном точном резервировании.
portfolio.perf.13@1.0.0Поэлементные переходы между представлениями Swift и Objective-C могут повторять boxing, allocation или conversion.
portfolio.perf.14@1.0.0Дорогой hash или equality многократно исполняется при lookup и может скрыть линейную или более высокую стоимость за API словаря.
portfolio.perf.15@1.0.0Маленький slice может удерживать большой backing storage значительно дольше, чем ожидает вызывающий код.
portfolio.perf.16@1.0.0Тысячи очень маленьких задач могут тратить больше времени на scheduling, чем на полезную работу.
portfolio.perf.17@1.0.0Неограниченный fan-out удерживает входы, captures и результаты сразу многих задач, вызывая высокий пик памяти.
security.sensitive-data-flow@1.0.0Секрет, попавший в лог, может стать доступен гораздо более широкому кругу систем и людей, чем исходное хранилище.
security.sql-structure-injection@1.0.0Интерполяция недоверенного значения в SQL смешивает данные и структуру запроса.
security.shell-command-injection@1.0.0Передача недоверенного текста оболочке позволяет интерпретировать его как команды и операторы.
security.format-position-injection@1.0.0Недоверенная format string управляет интерпретацией аргументов, а в низкоуровневых API может нарушить безопасность памяти.
security.path-traversal@1.0.0Имя файла из архива может вывести запись за каталог назначения через .., абсолютный путь или symlink.
security.javascript-code-injection@1.0.0Недоверенный текст в HTML или JavaScript может стать исполняемым кодом вместо содержимого.
security.privileged-url-input@1.0.0Пользовательский URL может направить привилегированный запрос к внутреннему сервису или недопустимой схеме.
portfolio.sec.09@1.0.0Формирование predicate из строки с пользовательским вводом позволяет изменить структуру условия.
portfolio.sec.10@1.0.0Недоверенное значение внутри regex меняет смысл поиска: данные становятся метасимволами регулярного выражения.
portfolio.sec.11@1.0.0Некоторые regex на специально подобранном длинном вводе требуют чрезмерного backtracking и блокируют обработчик.
portfolio.sec.12@1.0.0Разрешённые внешние XML entities могут читать локальные файлы или выполнять нежелательные сетевые обращения.
portfolio.sec.13@1.0.0Безусловное принятие сертификата убирает проверку подлинности сервера, хотя соединение выглядит зашифрованным.
portfolio.sec.14@1.0.0Криптографический примитив может работать корректно, но не подходить назначению: например, быстрый checksum не защищает пароль.
portfolio.sec.15@1.0.0Повтор nonce с одним ключом может разрушить гарантии схемы шифрования. Постоянная строка nonce особенно опасна при нескольких сообщениях.
portfolio.sec.16@1.0.0Быстрый или слишком дешёвый password derivation делает перебор украденной базы практичнее.
portfolio.sec.17@1.0.0Предсказуемый генератор позволяет угадывать токены, ключи и другие значения, безопасность которых зависит от случайности.
portfolio.sec.18@1.0.0Десериализация недоверенного объектного графа без ограничения типов допускает нежелательные объекты и поведение.
portfolio.sec.19@1.0.0Проверка доступа на одном пути не защищает другой путь к privileged sink; решение также может устареть к моменту применения.
portfolio.sec.20@1.0.0Значение может попасть к чувствительной операции по обходному пути, не проходящему обязательную проверку.
portfolio.sec.21@1.0.0Встроенный в shipping-продукт секрет доступен получателю бинарника и не может считаться серверной границей доверия.
portfolio.sec.22@1.0.0WebView, показывающий недоверенное содержимое, может получить bridge или доступы, предназначенные только доверенной странице.
portfolio.sec.23@1.0.0Ключ может быть корректно создан, но иметь недостаточную стойкость для выбранного назначения и политики.
portfolio.sec.24@1.0.0Зависимость, получаемая по незащищённому транспортному каналу, может быть подменена до попадания в сборку.
portfolio.sec.25@1.0.0Неопределённое разрешение зависимостей делает одну версию проекта зависимой от времени сборки и внешних изменений.
portfolio.sec.26@1.0.0Debug endpoint или обход проверки, попавший в shipping-вариант, открывает возможности, предназначенные только разработчику.
correctness.equality-hash-contract@1.0.0Set и Dictionary предполагают согласованность equality и hashing. Если равные значения получают разные хеш-входы, membership может вести себя неожиданно.
correctness.persisted-process-hash@1.0.0hashValue предназначен для внутрипроцессного хеширования и не является договором стабильной идентичности между запусками.
correctness.regex-range-units@1.0.0Числа похожи, но количество символов, UTF-8 байтов и UTF-16 единиц — разные величины. Ошибка проявляется на не-ASCII данных.
correctness.invalidated-collection-index@1.0.0Индекс связан с состоянием коллекции. Изменение структуры может сделать сохранённый индекс недействительным.
correctness.mutable-collection-key@1.0.0Мутация поля, участвующего в equality/hash, пока объект находится в Set или ключах Dictionary, ломает предположения membership.
correctness.bounded-ordering-law@1.0.0Алгоритм сортировки требует определённых законов сравнения. Их нарушение может давать нестабильный или неверный результат.
correctness.canonical-output-nondeterminism@1.0.0Нестабильный порядок становится дефектом, когда результат должен повторяться: например, подпись, cache key или canonical JSON.
portfolio.cor.08@1.0.0Преобразование числа или расчёт размера может выйти за допустимый диапазон и привести к trap либо неверному значению.
portfolio.cor.09@1.0.0Infinity и NaN допустимы для части вычислений, но нарушают контракт consumer, которому нужны только конечные значения.
portfolio.cor.10@1.0.0Force unwrap, try! или другой force operation опасен, когда существует допустимый путь к невыполнимому предусловию.
portfolio.cor.11@1.0.0Single-pass sequence может исчерпаться при первом чтении. Второй consumer не обязательно увидит те же элементы.
portfolio.cor.12@1.0.0Внешне скопированное значение может разделять внутреннее изменяемое состояние, хотя API обещает независимую копию.
portfolio.cor.13@1.0.0Разные правила нормализации одной identity приводят к пропускам lookup, дубликатам или обходу проверок.
portfolio.cor.14@1.0.0Значение вычислено и записано, но до любого наблюдения заменено другим. Это может быть пропущенное использование или лишняя работа.
portfolio.cor.15@1.0.0Предикат, одинаковый для всех допустимых состояний, может скрывать неверную проверку и создавать ложное ощущение защиты.
portfolio.cor.16@1.0.0Одинаковые результаты обеих ветвей могут означать ошибку копирования или лишнее условие. Сходство текста не доказывает равенства эффектов.
portfolio.cor.17@1.0.0Недостижимая ветвь может указывать на потерянный сценарий обработки или устаревшее предположение о входе.
portfolio.cor.18@1.0.0Чистая операция с отброшенным результатом часто означает, что программист ожидал изменения исходного значения.
portfolio.cor.19@1.0.0Точное сравнение приближённых величин может не соответствовать заявленному допуску и неверно различать эквивалентные измерения.
portfolio.stream.01@1.0.0Producer быстрее consumer, а буфер не ограничен: очередь событий способна расти без верхней границы памяти.
portfolio.stream.02@1.0.0Политика dropping нарушает контракт, если каждое событие должно быть обработано: потеря может выглядеть как успешная отправка.
portfolio.stream.03@1.0.0Одновременные next на одном iterator могут нарушать его контракт и приводить к потере или неправильной доставке элементов.
portfolio.stream.04@1.0.0Отсутствие finish после терминального события оставляет consumer ждать данные, которые уже никогда не придут.
portfolio.stream.05@1.0.0Retry без прогресса, лимита или backoff может бесконечно нагружать сервис и удерживать задачу.
portfolio.stream.06@1.0.0Повтор операции после неясного сетевого исхода может применить её дважды, даже если первый ответ не был получен.
portfolio.stream.07@1.0.0Логически единое изменение, разбитое на отдельные транзакции, оставляет частично применённое состояние при ошибке.
portfolio.ui.01@1.0.0Identity, создаваемая заново при каждом чтении, заставляет SwiftUI считать прежний элемент новым и терять его локальное состояние.
portfolio.ui.02@1.0.0Два разных элемента с одинаковым id делают сопоставление views неоднозначным.
portfolio.ui.03@1.0.0Изменение состояния во время вычисления зависимого представления может запускать повторные обновления без достижения устойчивого состояния.
portfolio.ui.04@1.0.0Начальное значение State не означает синхронизацию с каждым новым input. View с прежней identity может сохранить старое значение.
portfolio.change.01@1.0.0Изменение публичного API может сломать исходный код разрешённых consumers, хотя сама библиотека успешно собирается.
portfolio.change.02@1.0.0Бинарный consumer может стать несовместим с новой библиотекой без перекомпиляции, даже когда исходники выглядят похожими.
portfolio.change.03@1.0.0Неизменная сигнатура может скрывать смену порядка, ошибок, побочных эффектов или иного поведения, на которое опирается consumer.
portfolio.change.04@1.0.0После изменения импортов или overloads прежний код может разрешаться в другой символ и незаметно менять смысл.
portfolio.change.05@1.0.0Разрешённый version range может включать версию зависимости, с которой consumer несовместим.
portfolio.change.06@1.0.0Изменение может обойти обязательную проверку затронутых consumers из-за неполной карты impact или ошибочного gate.
portfolio.change.07@1.0.0Изменение может ухудшить гарантированную стоимость памяти или времени на сопоставимых входах, даже при сохранённом результате.
portfolio.change.08@1.0.0Кэш возвращает устаревший результат, если ключ или invalidation не учитывает зависимость вычисления.
Один RuleID может объединять несколько условий. Вид результата не задаёт severity, а стратегия первого результата не означает готовность. Обзор направлений →