Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

skiplist: Memory leak in SkipList test #614

Closed
taiki-e opened this issue Dec 9, 2020 · 2 comments · Fixed by #1022
Closed

skiplist: Memory leak in SkipList test #614

taiki-e opened this issue Dec 9, 2020 · 2 comments · Fixed by #1022

Comments

@taiki-e
Copy link
Member

taiki-e commented Dec 9, 2020

Run the following command on crossbeam-skiplist:

RUSTFLAGS='-Z sanitizer=address' \
cargo test --release --target x86_64-unknown-linux-gnu --test base

AddressSanitizer reports memory leak:

output
+ RUSTFLAGS='-Z sanitizer=address'
+ cargo test --release --target x86_64-unknown-linux-gnu --test base
   Compiling autocfg v1.0.1
   Compiling libc v0.2.81
   Compiling getrandom v0.1.15
   Compiling cfg-if v0.1.10
   Compiling lazy_static v1.4.0
   Compiling cfg-if v1.0.0
   Compiling ppv-lite86 v0.2.10
   Compiling scopeguard v1.1.0
   Compiling memoffset v0.6.1
   Compiling crossbeam-utils v0.8.1 (/home/runner/work/crossbeam/crossbeam/crossbeam-utils)
   Compiling rand_core v0.5.1
   Compiling crossbeam-epoch v0.9.1 (/home/runner/work/crossbeam/crossbeam/crossbeam-epoch)
   Compiling rand_chacha v0.2.2
   Compiling crossbeam-skiplist v0.0.0 (/home/runner/work/crossbeam/crossbeam/crossbeam-skiplist)
   Compiling rand v0.7.3
    Finished release [optimized] target(s) in 14.27s
     Running /home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd

running 20 tests
test clear ... ok
test drops ... ok
test entry ... ok
test entry_remove ... ok
test entry_reposition ... ok
test front_and_back ... ok
test get ... ok
test get_next_prev ... ok
test get_or_insert ... ok
test insert ... ok
test insert_and_remove ... ok
test into_iter ... ok
test is_empty ... ok
test iter ... ok
test iter_range ... ok
test len ... ok
test lower_bound ... ok
test new ... ok
test remove ... ok
test upper_bound ... ok

test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s


=================================================================
==4419==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 120 byte(s) in 5 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2cde29  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xc2e29)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 104 byte(s) in 4 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2d3dbb  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xc8dbb)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 56 byte(s) in 2 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2da652  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xcf652)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 48 byte(s) in 2 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2cab5b  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xbfb5b)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 40 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2bf896  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xb4896)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 40 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2da749  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xcf749)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 32 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2bf6a5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xb46a5)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2d5451  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xca451)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2d541b  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xca41b)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2dbda9  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xd0da9)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2bf4b4  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xb44b4)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2be4b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xb34b5)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2da7c5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xcf7c5)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2be4e9  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xb34e9)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2be501  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xb3501)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Direct leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2d115a  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xc615a)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Indirect leak of 128 byte(s) in 5 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2cab5b  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xbfb5b)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Indirect leak of 56 byte(s) in 2 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2cde29  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xc2e29)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Indirect leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2d546c  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xca46c)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Indirect leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2bfa87  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xb4a87)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Indirect leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2be519  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xb3519)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

Indirect leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x5636fa29a7ed  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x8f7ed)
    #1 0x5636fa3042b5  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xf92b5)
    #2 0x5636fa2be4d1  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0xb34d1)
    #3 0x5636fa338ad2  (/home/runner/work/crossbeam/crossbeam/target/x86_64-unknown-linux-gnu/release/deps/base-83127d336c549fdd+0x12dad2)

SUMMARY: AddressSanitizer: 936 byte(s) leaked in 36 allocation(s).
error: test failed, to rerun pass '--test base'

Found in #591 (https://github.com/crossbeam-rs/crossbeam/runs/1524623353?check_suite_focus=true)

ankitbhrdwj added a commit to gz/node-replication that referenced this issue Feb 2, 2021
Current skiplist implementation has a memory leak
crossbeam-rs/crossbeam#614
bors bot added a commit that referenced this issue Feb 15, 2021
591: Run sanitizers on CI r=jeehoonkang a=taiki-e

This adds AddressSanitizer/MemorySanitizer/ThreadSanitizer tests to CI.

See #589 (tsan: data race in deque), #644 (tsan: data race in atomic), and #614 (asan: memory leak in skiplist) for issues reported by sanitizers.

Closes #154
Closes #589
Closes #644 

Refs: 
- https://doc.rust-lang.org/nightly/unstable-book/compiler-flags/sanitizer.html
- https://github.com/google/sanitizers/wiki

Co-authored-by: Taiki Endo <te316e89@gmail.com>
@taiki-e taiki-e added the bug label Mar 4, 2021
@taiki-e taiki-e changed the title skiplist: AddressSanitizer reports memory leak skiplist: Memory leak in SkipList Apr 10, 2021
@taiki-e
Copy link
Member Author

taiki-e commented Apr 18, 2021

This seems to be related to base::RefEntry not implementing Drop (#337).

Also, this only happens with SkipList, and SkipMap and SkipSet don't seem to have this problem. (#674)

@topecongiro
Copy link
Contributor

FYI: Entry for SkipMap and SkipSet implements Drop, which in turn calls release_with_pin so these two types don't suffer from memory leak.

I don't necessarily think this is a bug as the doc comment on RefEntry explicitly states about this behavior, just that it is easier to shoot yourself in the foot than a typical Rust API. Of course not great, but a necessary evil when dealing with lock-free stuff IMHO.

Concerning the 0.1 release, is it feasible to make SkipList private as it is prone to misuse? Personally, it feels unnecessary to expose SkipList when we already have SkipMap and SkipSet.

@taiki-e taiki-e removed the bug label Aug 26, 2023
@taiki-e taiki-e changed the title skiplist: Memory leak in SkipList skiplist: Memory leak in SkipList test Aug 26, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

Successfully merging a pull request may close this issue.

2 participants