Skip to content

Valgrind reports "possibly lost" when using static Regex #1205

Closed as not planned
@wyfo

Description

@wyfo

What version of regex are you using?

regex = "1.10.5"

Describe the bug at a high level.

Valgrind reports "possibly lost" when using static Regex.

What are the steps to reproduce the behavior?

use regex::Regex;

static mut REGEX: Option<Regex> = None;

fn main() {
    unsafe {
        REGEX = Regex::new(r"").ok();
        REGEX.as_ref().unwrap().captures("");
    }
}

What is the actual behavior?

Here is valgrind command and report:

valgrind --leak-check=full --num-callers=50 target/debug/regex-leak
==17154== Memcheck, a memory error detector
==17154== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==17154== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info
==17154== Command: target/debug/regex-leak
==17154== 
==17154== 
==17154== HEAP SUMMARY:
==17154==     in use at exit: 7,266 bytes in 51 blocks
==17154==   total heap usage: 122 allocs, 71 frees, 13,048 bytes allocated
==17154== 
==17154== 108 bytes in 1 blocks are possibly lost in loss record 41 of 51
==17154==    at 0x4885250: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm64-linux.so)
==17154==    by 0x1B4B67: alloc (alloc.rs:98)
==17154==    by 0x1B4B67: alloc::alloc::Global::alloc_impl (alloc.rs:181)
==17154==    by 0x1B557B: <alloc::alloc::Global as core::alloc::Allocator>::allocate (alloc.rs:241)
==17154==    by 0x1AE187: hashbrown::raw::alloc::inner::do_alloc (alloc.rs:15)
==17154==    by 0x1B6D77: hashbrown::raw::RawTableInner::new_uninitialized (mod.rs:1754)
==17154==    by 0x1B70FB: hashbrown::raw::RawTableInner::fallible_with_capacity (mod.rs:1792)
==17154==    by 0x1B5F13: hashbrown::raw::RawTableInner::prepare_resize (mod.rs:2871)
==17154==    by 0x1B9167: resize_inner<alloc::alloc::Global> (mod.rs:3067)
==17154==    by 0x1B9167: reserve_rehash_inner<alloc::alloc::Global> (mod.rs:2957)
==17154==    by 0x1B9167: hashbrown::raw::RawTable<T,A>::reserve_rehash (mod.rs:1235)
==17154==    by 0x1BA85F: hashbrown::raw::RawTable<T,A>::reserve (mod.rs:1183)
==17154==    by 0x1B9A6B: hashbrown::raw::RawTable<T,A>::find_or_find_insert_slot (mod.rs:1417)
==17154==    by 0x189B6F: hashbrown::map::HashMap<K,V,S,A>::insert (map.rs:1754)
==17154==    by 0x17BEAB: std::collections::hash::map::HashMap<K,V,S>::insert (map.rs:1105)
==17154==    by 0x1CA35B: regex_automata::hybrid::dfa::Lazy::add_state (dfa.rs:2309)
==17154==    by 0x1CC05B: regex_automata::hybrid::dfa::Lazy::init_cache (dfa.rs:2534)
==17154==    by 0x1C85EF: regex_automata::hybrid::dfa::Cache::new (dfa.rs:1891)
==17154==    by 0x22914F: regex_automata::hybrid::regex::Cache::new (regex.rs:613)
==17154==    by 0x228B2B: regex_automata::hybrid::regex::Regex::create_cache (regex.rs:192)
==17154==    by 0x1A5DCF: regex_automata::meta::wrappers::HybridCache::new::{{closure}} (wrappers.rs:788)
==17154==    by 0x1BDB03: core::option::Option<T>::map (option.rs:1072)
==17154==    by 0x1A5D9B: regex_automata::meta::wrappers::HybridCache::new (wrappers.rs:788)
==17154==    by 0x1A5183: regex_automata::meta::wrappers::Hybrid::create_cache (wrappers.rs:541)
==17154==    by 0x192E43: <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache (strategy.rs:679)
==17154==    by 0x18B70F: regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}} (regex.rs:3556)
==17154==    by 0x14D73B: <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call (boxed.rs:2021)
==17154==    by 0x149223: regex_automata::util::pool::inner::Pool<T,F>::get_slow (pool.rs:568)
==17154==    by 0x1490DF: regex_automata::util::pool::inner::Pool<T,F>::get (pool.rs:533)
==17154==    by 0x14C01F: regex_automata::util::pool::Pool<T,F>::get (pool.rs:182)
==17154==    by 0x149D6B: regex_automata::meta::regex::Regex::search_slots (regex.rs:1134)
==17154==    by 0x149EC3: regex_automata::meta::regex::Regex::search_captures (regex.rs:1065)
==17154==    by 0x14B453: regex::regex::string::Regex::captures_at (string.rs:1151)
==17154==    by 0x14B5B3: regex::regex::string::Regex::captures (string.rs:356)
==17154==    by 0x14ACC3: regex_leak::main (main.rs:8)
==17154==    by 0x14B73B: core::ops::function::FnOnce::call_once (function.rs:250)
==17154==    by 0x14D7F7: std::sys_common::backtrace::__rust_begin_short_backtrace (backtrace.rs:154)
==17154==    by 0x14AFEB: std::rt::lang_start::{{closure}} (rt.rs:167)
==17154==    by 0x344577: call_once<(), (dyn core::ops::function::Fn<(), Output=i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)> (function.rs:284)
==17154==    by 0x344577: do_call<&(dyn core::ops::function::Fn<(), Output=i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32> (panicking.rs:552)
==17154==    by 0x344577: try<i32, &(dyn core::ops::function::Fn<(), Output=i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)> (panicking.rs:516)
==17154==    by 0x344577: catch_unwind<&(dyn core::ops::function::Fn<(), Output=i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32> (panic.rs:142)
==17154==    by 0x344577: {closure#2} (rt.rs:148)
==17154==    by 0x344577: do_call<std::rt::lang_start_internal::{closure_env#2}, isize> (panicking.rs:552)
==17154==    by 0x344577: try<isize, std::rt::lang_start_internal::{closure_env#2}> (panicking.rs:516)
==17154==    by 0x344577: catch_unwind<std::rt::lang_start_internal::{closure_env#2}, isize> (panic.rs:142)
==17154==    by 0x344577: std::rt::lang_start_internal (rt.rs:148)
==17154==    by 0x14AFBB: std::rt::lang_start (rt.rs:166)
==17154==    by 0x14AD03: main (in /app/target/debug/regex-leak)
==17154== 
==17154== 108 bytes in 1 blocks are possibly lost in loss record 42 of 51
==17154==    at 0x4885250: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm64-linux.so)
==17154==    by 0x1B4B67: alloc (alloc.rs:98)
==17154==    by 0x1B4B67: alloc::alloc::Global::alloc_impl (alloc.rs:181)
==17154==    by 0x1B557B: <alloc::alloc::Global as core::alloc::Allocator>::allocate (alloc.rs:241)
==17154==    by 0x1AE187: hashbrown::raw::alloc::inner::do_alloc (alloc.rs:15)
==17154==    by 0x1B6D77: hashbrown::raw::RawTableInner::new_uninitialized (mod.rs:1754)
==17154==    by 0x1B70FB: hashbrown::raw::RawTableInner::fallible_with_capacity (mod.rs:1792)
==17154==    by 0x1B5F13: hashbrown::raw::RawTableInner::prepare_resize (mod.rs:2871)
==17154==    by 0x1B9167: resize_inner<alloc::alloc::Global> (mod.rs:3067)
==17154==    by 0x1B9167: reserve_rehash_inner<alloc::alloc::Global> (mod.rs:2957)
==17154==    by 0x1B9167: hashbrown::raw::RawTable<T,A>::reserve_rehash (mod.rs:1235)
==17154==    by 0x1BA85F: hashbrown::raw::RawTable<T,A>::reserve (mod.rs:1183)
==17154==    by 0x1B9A6B: hashbrown::raw::RawTable<T,A>::find_or_find_insert_slot (mod.rs:1417)
==17154==    by 0x189B6F: hashbrown::map::HashMap<K,V,S,A>::insert (map.rs:1754)
==17154==    by 0x17BEAB: std::collections::hash::map::HashMap<K,V,S>::insert (map.rs:1105)
==17154==    by 0x1CA35B: regex_automata::hybrid::dfa::Lazy::add_state (dfa.rs:2309)
==17154==    by 0x1CC05B: regex_automata::hybrid::dfa::Lazy::init_cache (dfa.rs:2534)
==17154==    by 0x1C85EF: regex_automata::hybrid::dfa::Cache::new (dfa.rs:1891)
==17154==    by 0x229187: regex_automata::hybrid::regex::Cache::new (regex.rs:614)
==17154==    by 0x228B2B: regex_automata::hybrid::regex::Regex::create_cache (regex.rs:192)
==17154==    by 0x1A5DCF: regex_automata::meta::wrappers::HybridCache::new::{{closure}} (wrappers.rs:788)
==17154==    by 0x1BDB03: core::option::Option<T>::map (option.rs:1072)
==17154==    by 0x1A5D9B: regex_automata::meta::wrappers::HybridCache::new (wrappers.rs:788)
==17154==    by 0x1A5183: regex_automata::meta::wrappers::Hybrid::create_cache (wrappers.rs:541)
==17154==    by 0x192E43: <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache (strategy.rs:679)
==17154==    by 0x18B70F: regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}} (regex.rs:3556)
==17154==    by 0x14D73B: <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call (boxed.rs:2021)
==17154==    by 0x149223: regex_automata::util::pool::inner::Pool<T,F>::get_slow (pool.rs:568)
==17154==    by 0x1490DF: regex_automata::util::pool::inner::Pool<T,F>::get (pool.rs:533)
==17154==    by 0x14C01F: regex_automata::util::pool::Pool<T,F>::get (pool.rs:182)
==17154==    by 0x149D6B: regex_automata::meta::regex::Regex::search_slots (regex.rs:1134)
==17154==    by 0x149EC3: regex_automata::meta::regex::Regex::search_captures (regex.rs:1065)
==17154==    by 0x14B453: regex::regex::string::Regex::captures_at (string.rs:1151)
==17154==    by 0x14B5B3: regex::regex::string::Regex::captures (string.rs:356)
==17154==    by 0x14ACC3: regex_leak::main (main.rs:8)
==17154==    by 0x14B73B: core::ops::function::FnOnce::call_once (function.rs:250)
==17154==    by 0x14D7F7: std::sys_common::backtrace::__rust_begin_short_backtrace (backtrace.rs:154)
==17154==    by 0x14AFEB: std::rt::lang_start::{{closure}} (rt.rs:167)
==17154==    by 0x344577: call_once<(), (dyn core::ops::function::Fn<(), Output=i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)> (function.rs:284)
==17154==    by 0x344577: do_call<&(dyn core::ops::function::Fn<(), Output=i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32> (panicking.rs:552)
==17154==    by 0x344577: try<i32, &(dyn core::ops::function::Fn<(), Output=i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)> (panicking.rs:516)
==17154==    by 0x344577: catch_unwind<&(dyn core::ops::function::Fn<(), Output=i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32> (panic.rs:142)
==17154==    by 0x344577: {closure#2} (rt.rs:148)
==17154==    by 0x344577: do_call<std::rt::lang_start_internal::{closure_env#2}, isize> (panicking.rs:552)
==17154==    by 0x344577: try<isize, std::rt::lang_start_internal::{closure_env#2}> (panicking.rs:516)
==17154==    by 0x344577: catch_unwind<std::rt::lang_start_internal::{closure_env#2}, isize> (panic.rs:142)
==17154==    by 0x344577: std::rt::lang_start_internal (rt.rs:148)
==17154==    by 0x14AFBB: std::rt::lang_start (rt.rs:166)
==17154==    by 0x14AD03: main (in /app/target/debug/regex-leak)
==17154== 
==17154== LEAK SUMMARY:
==17154==    definitely lost: 0 bytes in 0 blocks
==17154==    indirectly lost: 0 bytes in 0 blocks
==17154==      possibly lost: 216 bytes in 2 blocks
==17154==    still reachable: 7,050 bytes in 49 blocks
==17154==         suppressed: 0 bytes in 0 blocks
==17154== Reachable blocks (those to which a pointer was found) are not shown.
==17154== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==17154== 
==17154== For lists of detected and suppressed errors, rerun with: -s
==17154== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

What is the expected behavior?

I expect to have still reachable blocks, but I don't know the reason of possibly lost.

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