Skip to content

yume190/LeakDetect

Folders and files

NameName
Last commit message
Last commit date

Latest commit

2726d6c · Sep 18, 2023

History

56 Commits
Sep 18, 2023
Sep 18, 2023
Sep 18, 2023
Sep 13, 2023
Aug 31, 2023
Sep 14, 2023
Aug 25, 2023
Sep 6, 2023
May 25, 2022
Sep 14, 2023
Sep 13, 2023
Sep 18, 2023
Sep 14, 2023
Sep 14, 2023
Sep 14, 2023
May 25, 2022

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