Skip to content

yume190/LeakDetect

Repository files navigation

Leak Detect


A Tool to Detect Swift Potential Leaks

Installation

brew install mint
mint install yume190/LeakDetect

Usage

leakDetect \
    --module "SCHEME NAME" \
    --file Sample.xcworkspace

leakDetect \
    --module "SCHEME NAME" \
    --file Sample.xcodeproj

# spm
leakDetect \
    --module TARGET_NAME \
    --file .

# file
leakDetect \
    --sdk macosx \
    --file xxx.swift

Usage(Github Action)

jobs:
  build:

    runs-on: macos-latest

    steps:
    - uses: actions/checkout@v3
    - uses: yume190/LeakDetect@0.0.8
      with:
        # https://github.com/antranapp/LeakDetector
        module: LeakDetectorDemo
        file: LeakDetectorDemo.xcworkspace
        token: ${{secrets.GITHUB_TOKEN}}

Skip List

default path is .leakdetect.yml, or you can use --skip list.yml.

functions:
  # objc function `Dispatch.DispatchQueue.main.async {...}`
  - module: Dispatch
    types:
    - name: DispatchQueue
      instance_functions:
      - async
      - asyncAfter
  # static function `UIKit.UIView.UIView.anmiate {...}`
  - module: UIKit.UIView
    types:
    - name: UIView
      static_functions:
      - animate
  # Some Special case
  - module: YOUR_MODULE_NAME
    types:
    # global function `func escape(...) {}`
    - name: ""
      instance_functions:
      - escape
    # constructor `struct A {...}`
    # A(...) {}
    - name: A
      static_functions:
      - init
    # Nested Type A.B
    - name: A.B
    # Generic Type C<T>.D<U>
    # ignore generic
    - name: C.D

Mode

Detect assign instance function.

  1. x = self.func

    • Check function is instance function.
    • Check self is struct
  2. y(self.func)

    • Check function is instance function.
    • Check parameter is escaping closure

see Don't use this syntax!.

func escape(block: @escaping () -> Void) {}
class Temp {
  func instanceFunction() {}
  func leak() {
    let x = self.instanceFunction
    escape(block: self.instanceFunction)
  }
}

Capture

Detect instance captured by blocks(closure/function).

Example

# Example:
git clone https://github.com/antranapp/LeakDetector
cd LeakDetector

leakDetect \
    --module LeakDetectorDemo \
    --file LeakDetectorDemo.xcworkspace