graydon/rust — Issue #1175: Some return values are not valgrind clean when not assigned
Author: jdm
Created: 2011-11-14 19:22:24+00:00
State: open

Sorry for the vague summary, but I've reduced this testcase about as far as I can.

import std::{str, option, unsafe, vec};
use std;

type metadata = {node: int, data: @T};
type compile_unit_md = {path: str};
type metadata_cache = [@debug_metadata];

tag debug_metadata {
compile_unit_metadata(@metadata);
}

fn md_from_metadata(val: @debug_metadata) -> @metadata unsafe {
alt *val {
compile_unit_metadata(md) { unsafe::reinterpret_cast(md) }
}
}

fn get_compile_unit_metadata(cache: metadata_cache, full_path: str)
-> @metadata {
ret md_from_metadata::(cache[0]);
}

fn main() {
let cache = [@compile_unit_metadata(@{node: 1, data: @{path: "test/a"}})];
get_compile_unit_metadata(cache, "test/a/b");
get_compile_unit_metadata(cache, "test/a/b");
get_compile_unit_metadata(cache, "test/a/b");
}

When running the above, I get output like:

godot:build jdm$ ~/src/rustbug
rustbug(24826,0xb0305000) malloc: *** error for object 0x11001a0: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug

and valgrind has lots of entries for glue_drop15:

==24813== Invalid read of size 4
==24813== at 0x30A6: glue_drop15 (in /Users/jdm/src/rustbug)
==24813== by 0x232A: main::_e820af82886e4814 (in /Users/jdm/src/rustbug)
==24813== by 0x259A: _rust_main (in /Users/jdm/src/rustbug)
==24813== by 0x34E717: task_start_wrapper (in /Users/jdm/src/rust/build/stage2/lib/rustc/i686-apple-darwin/lib/librustrt.dylib)
==24813== by 0xDEADBEEE: ???
==24813== Address 0x1c08d60 is 0 bytes inside a block of size 12 free'd
==24813== at 0x1243A: free (vg_replace_malloc.c:430)
==24813== by 0x351B79: upcall_free (in /Users/jdm/src/rust/build/stage2/lib/rustc/i686-apple-darwin/lib/librustrt.dylib)
==24813== by 0x3165: glue_free16 (in /Users/jdm/src/rustbug)
==24813== by 0x30E3: glue_drop15 (in /Users/jdm/src/rustbug)
==24813== by 0x2201: main::_e820af82886e4814 (in /Users/jdm/src/rustbug)
==24813== by 0x259A: _rust_main (in /Users/jdm/src/rustbug)
==24813== by 0x34E717: task_start_wrapper (in /Users/jdm/src/rust/build/stage2/lib/rustc/i686-apple-darwin/lib/librustrt.dylib)
==24813== by 0xDEADBEEE: ???

If I assign the result of get_compile_metadata to a local var valgrind still complains, but the malloc error doesn't seem to show up any more.