https://bugs.kde.org/show_bug.cgi?id=452058
Bug ID: 452058
Summary: Generated suppressions contain a mix of mangled
(physical) and demangled (inline) frames
Product: valgrind
Version: unspecified
Platform: Other
OS: Linux
Status: REPORTED
Severity: normal
Priority: NOR
Component: general
Assignee: [email protected]
Reporter: [email protected]
Target Milestone: ---
Put this Rust program in `a.rs`:
use std::io::{stdin, Read};
fn main() {
let mut buf = vec![];
if let Err(e) = stdin().read(&mut buf) {
println!("{}", e)
}
}
Then build it with: rustc a.rs
Then run: valgrind --leak-check=full --show-leak-kinds=all
--gen-suppressions=all ./a
Then hit enter, to provide the running program with necessary input.
On termination, Memcheck prints two suppressions. Here's the first one, which
is enough to show the problem:
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: reachable
fun:malloc
fun:alloc
fun:alloc_impl
fun:allocate
fun:exchange_malloc
fun:new<std::sys::unix::mutex::Mutex>
fun:from<std::sys::unix::mutex::Mutex>
fun:_ZN3std10sys_common5mutex12MovableMutex3new17h4e64539bf4ba99a6E
fun:new<std::io::buffered::bufreader::BufReader<std::io::stdio::StdinRaw>>
fun:{closure#0}
fun:{closure#0}<std::sync::mutex::Mutex<std::io::buffered::bufreader::BufReader<std::io::stdio::StdinRaw>>,
std::io::stdio::stdin::{closure#0}>
fun:{closure#0}<std::sync::mutex::Mutex<std::io::buffered::bufreader::BufReader<std::io::stdio::StdinRaw>>,
std::lazy::{impl#10}::get_or_init::{closure#0}, !>
fun:_ZN3std4sync4once4Once15call_once_force28_$u7b$$u7b$closure$u7d$$u7d$17ha9375aeb05e4aae3E
fun:_ZN3std4sync4once4Once10call_inner17hb3a655ef2ff7c156E
fun:call_once_force<std::lazy::{impl#10}::initialize::{closure#0}>
fun:_ZN3std4lazy21SyncOnceCell$LT$T$GT$10initialize17h3a3ef5fbb9e2970eE
fun:get_or_try_init<std::sync::mutex::Mutex<std::io::buffered::bufreader::BufReader<std::io::stdio::StdinRaw>>,
std::lazy::{impl#10}::get_or_init::{closure#0}, !>
fun:get_or_init<std::sync::mutex::Mutex<std::io::buffered::bufreader::BufReader<std::io::stdio::StdinRaw>>,
std::io::stdio::stdin::{closure#0}>
fun:_ZN3std2io5stdio5stdin17h94821c2f5cbdd619E
fun:_ZN1a4main17h8bbda9164eb1d7fdE
fun:_ZN4core3ops8function6FnOnce9call_once17hb0b8acf7ed5a9c1fE
fun:_ZN3std10sys_common9backtrace28__rust_begin_short_backtrace17hedc3d4705fc28138E
fun:_ZN3std2rt10lang_start28_$u7b$$u7b$closure$u7d$$u7d$17h478bd93d3dae3c53E
fun:call_once<(), (dyn core::ops::function::Fn<(), Output=i32> +
core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)>
fun:do_call<&(dyn core::ops::function::Fn<(), Output=i32> +
core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32>
fun:try<i32, &(dyn core::ops::function::Fn<(), Output=i32> +
core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)>
fun:catch_unwind<&(dyn core::ops::function::Fn<(), Output=i32> +
core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32>
fun:{closure#2}
fun:do_call<std::rt::lang_start_internal::{closure#2}, isize>
fun:try<isize, std::rt::lang_start_internal::{closure#2}>
fun:catch_unwind<std::rt::lang_start_internal::{closure#2}, isize>
fun:_ZN3std2rt19lang_start_internal17hd15a47be08101c28E
fun:_ZN3std2rt10lang_start17h99d3162981a37fa3E
}
Suppressions are supposed to use *mangled* function names, but this has a mix
of mangled and demangled names. I did some digging and discovered that physical
stack frames are correctly showing as mangled, but inline stack frames are
incorrectly showing as demangled.
The Rust compiler tends to inline aggressively. This bug makes it very hard to
write suppressions, because frames that might be inlined one day might be
non-inlined later on after making moderate changes to a program.
This bug is preventing me from adding a useful suppression for the Rust
standard library. See https://github.com/rust-lang/rust/issues/80406 for
details.
--
You are receiving this mail because:
You are watching all bug changes.