Skip to content

LeakSanitizer gives false positives when used with Swift on Linux  #56751

Open
@hassila

Description

@hassila

As originally reported here:

swiftlang/swift-corelibs-xctest#342

I get false leak positives when enabling LSan with Swift/Linux - according to helpful engineers there it seems to be due to Swift doing smart 'bit stuffing' of pointers.

It is worth noting that the same simple test does not give a false positive on macOS, so it may be that relevant code is platform-defined out (unnecessarily) for Linux.

I'm running with the 5.6 swift toolchain and related artifacts - this is reproduced on Ubuntu - running

gives the following from xctest:

ubuntu@swift:/home/xyzzy/swift-data-model$ swift test --sanitize address | swift demangle
Compiling plugin Swift-DocC...
Compiling plugin Swift-DocC Preview...
Building for debugging...
[1/3] Emitting module DataModelTests
[2/3] Compiling DataModelTests DataModelTests.swift
[5/8] /home/xyzzy/swift-data-model/.build/aarch64-unknown-linux-gnu/debug/swift-data-modelPackageTests.derived/runner.swift
[6/8] Wrapping AST for DataModelTests for debugging
[7/11] Compiling swift_data_modelPackageTests runner.swift
[8/11] Compiling swift_data_modelPackageTests DataModelTests.swift
[9/11] Emitting module swift_data_modelPackageTests
[12/13] Wrapping AST for swift-data-modelPackageTests for debugging
/usr/bin/ld.gold: warning: Cannot export local symbol '__asan_extra_spill_area'
[13/13] Linking swift-data-modelPackageTests.xctest
Build complete! (3.13s)
Test Suite 'All tests' started at 2022-04-27 18:31:07.420
Test Suite 'debug.xctest' started at 2022-04-27 18:31:07.423
Test Suite 'DataModelTests' started at 2022-04-27 18:31:07.423
Test Case 'DataModelTests.testThatDataModelFailsWriting' started at 2022-04-27 18:31:07.423
Test Case 'DataModelTests.testThatDataModelFailsWriting' passed (0.153 seconds)
Test Suite 'DataModelTests' passed at 2022-04-27 18:31:07.577
	 Executed 1 test, with 0 failures (0 unexpected) in 0.153 (0.153) seconds
Test Suite 'debug.xctest' passed at 2022-04-27 18:31:07.577
	 Executed 1 test, with 0 failures (0 unexpected) in 0.153 (0.153) seconds
Test Suite 'All tests' passed at 2022-04-27 18:31:07.577
	 Executed 1 test, with 0 failures (0 unexpected) in 0.153 (0.153) seconds

=================================================================
==6874==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 32 byte(s) in 1 object(s) allocated from:
    #0 0xaaaad334683c in malloc /home/build-user/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:129:3
    #1 0xffff9861db58 in operator new(unsigned long) (/lib/aarch64-linux-gnu/libstdc++.so.6+0x9fb58)
    #2 0xffff997ce258 in swift::RefCounts<swift::RefCountBitsT<(swift::RefCountInlinedness)1> >::formWeakReference() (/usr/lib/swift/linux/libswiftCore.so+0x3ea258)
    #3 0xffff9979e938 in swift_weakAssign (/usr/lib/swift/linux/libswiftCore.so+0x3ba938)
    #4 0xffff98951168 in $s6XCTest9XCTWaiterC4wait3for7timeout12enforceOrder4file4lineAC6ResultOSayAA0A11ExpectationCG_SdSbs12StaticStringVSitF (/usr/lib/swift/linux/libXCTest.so+0x3f168)
    #5 0xffff989514a8 in $s6XCTest9XCTWaiterC4wait3for7timeout12enforceOrder4file4lineAC6ResultOSayAA0A11ExpectationCG_SdSbs12StaticStringVSitFZ (/usr/lib/swift/linux/libXCTest.so+0x3f4a8)
    #6 0xffff9893fda8 in $s6XCTest21awaitUsingExpectationyyyyYaKcKF (/usr/lib/swift/linux/libXCTest.so+0x2dda8)
    #7 0xffff9893f37c in $s6XCTest0A4CaseC10invokeTestyyF (/usr/lib/swift/linux/libXCTest.so+0x2d37c)
    #8 0xffff9893f1b0 in $s6XCTest0A4CaseC7performyyAA0A3RunCF (/usr/lib/swift/linux/libXCTest.so+0x2d1b0)
    #9 0xffff989436d4 in $s6XCTestAAC3runyyF (/usr/lib/swift/linux/libXCTest.so+0x316d4)
    #10 0xffff9894194c in $s6XCTest0A5SuiteC7performyyAA0A3RunCF (/usr/lib/swift/linux/libXCTest.so+0x2f94c)
    #11 0xffff989436d4 in $s6XCTestAAC3runyyF (/usr/lib/swift/linux/libXCTest.so+0x316d4)
    #12 0xffff9894194c in $s6XCTest0A5SuiteC7performyyAA0A3RunCF (/usr/lib/swift/linux/libXCTest.so+0x2f94c)
    #13 0xffff989436d4 in $s6XCTestAAC3runyyF (/usr/lib/swift/linux/libXCTest.so+0x316d4)
    #14 0xffff9894194c in $s6XCTest0A5SuiteC7performyyAA0A3RunCF (/usr/lib/swift/linux/libXCTest.so+0x2f94c)
    #15 0xffff989436d4 in $s6XCTestAAC3runyyF (/usr/lib/swift/linux/libXCTest.so+0x316d4)
    #16 0xffff9893dee0 in $s6XCTest7XCTMain_9arguments9observerss5NeverOSayAA0A4CaseCm04testF5Class_SaySS_yAHKctG8allTeststG_SaySSGSayAA0A11Observation_pGtF (/usr/lib/swift/linux/libXCTest.so+0x2bee0)
    #17 0xffff9893da58 in $s6XCTest7XCTMainys5NeverOSayAA0A4CaseCm04testD5Class_SaySS_yAFKctG8allTeststGF (/usr/lib/swift/linux/libXCTest.so+0x2ba58)
    #18 0xaaaad36ef024 in $s28swift_data_modelPackageTests6RunnerV4mainyyFZ /home/xyzzy/swift-data-model/.build/aarch64-unknown-linux-gnu/debug/swift-data-modelPackageTests.derived/runner.swift:10:9
    #19 0xaaaad36ef098 in $s28swift_data_modelPackageTests6RunnerV5$mainyyFZ /home/xyzzy/swift-data-model/.build/aarch64-unknown-linux-gnu/debug/swift-data-modelPackageTests.derived/runner.swift:3:1
    #20 0xaaaad36ef0b0 in main /home/xyzzy/swift-data-model/.build/aarch64-unknown-linux-gnu/debug/swift-data-modelPackageTests.derived/runner.swift
    #21 0xffff98783d4c in __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x20d4c)
    #22 0xaaaad32d3670 in _start (/home/xyzzy/swift-data-model/.build/aarch64-unknown-linux-gnu/debug/swift-data-modelPackageTests.xctest+0x91670)

SUMMARY: AddressSanitizer: 32 byte(s) leaked in 1 allocation(s).
ubuntu@swift:/home/xyzzy/swift-data-model$ 

The test is just empty (after having stripped it out piece by piece to nail down the leaker):

import XCTest

@testable import DataModel
@testable import DataModelExecutable

final class DataModelTests: XCTestCase {

    override func setUp() {
        super.setUp()
    }

    override func tearDown() {
        super.tearDown()
    }

    func testThatDataModelFailsWriting() async throws {
    }
}

On macOS with the xctest running there with Xcode 13.3, I don't get any leak notified.

There are some relevant background discussion in the linked case above - let me know if you need additional information.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions