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.7
      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.

# objc function `Dispatch.DispatchQueue.main.async {...}`
- module: Dispatch
  types:
  - name: DispatchQueue
    funcs:
    - async
    - asyncAfter
# static function `UIKit.UIView.UIView.anmiate {...}`
- module: UIKit.UIView
  types:
  - name: UIView
    staitc:
    - animate
# Some Special case
- module: YOUR_MODULE_NAME
  types:
  # global function `func escape(...) {}`
  - name: ""
    funcs:
    - escape
  # constructor `struct A {...}`
  # A(...) {}
  - name: A
    staitc:
    - 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