Code Monkey home page Code Monkey logo

cargo-valgrind's Introduction

cargo-valgrind

A cargo subcommand, that runs valgrind and collects its output in a helpful manner.

Latest version Documentation

This command extends cargo with the capability to directly run valgrind on any crate executable. The output of valgrind is then used to mark the binary as pass/fail.

This command should not be necessary for ordinary Rust programs, especially if you are only using safe Rust code. But if you do FFI-related stuff (either by simply using a FFI-binding crate or because you are developing a safe wrapper for such FFI bindings) it may be really helpful to check, whether the memory usages across the FFI borders are correct.

Usage

A typical mistake would be:

use std::ffi::CString;
use std::os::raw::c_char;

extern "C" {
    fn puts(s: *const c_char);
}

fn main() {
    let string = CString::new("Test").unwrap();

    let ptr = string.into_raw();
    unsafe { puts(ptr) };

    // unsafe { CString::from_raw(ptr) };
}

The memory of the variable string will never be freed. If you run cargo valgrind run in your shell, it detects the leak:

$ cargo valgrind run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/cstring`
Test
       Error Leaked 5 bytes
        Info at realloc (vg_replace_malloc.c:826)
             at realloc (alloc.rs:125)
             at realloc (alloc.rs:184)
             at reserve_internal<u8,alloc::alloc::Global> (raw_vec.rs:666)
             at reserve_exact<u8,alloc::alloc::Global> (raw_vec.rs:411)
             at reserve_exact<u8> (vec.rs:482)
             at std::ffi::c_str::CString::from_vec_unchecked (c_str.rs:355)
             at std::ffi::c_str::CString::_new (c_str.rs:330)
             at std::ffi::c_str::CString::new (c_str.rs:324)
             at cstring::main (main.rs:9)
             at std::rt::lang_start::{{closure}} (rt.rs:64)
             at {{closure}} (rt.rs:49)
             at std::panicking::try::do_call (panicking.rs:293)
             at __rust_maybe_catch_panic (lib.rs:85)
             at try<i32,closure> (panicking.rs:272)
             at catch_unwind<closure,i32> (panic.rs:394)
             at std::rt::lang_start_internal (rt.rs:48)
             at std::rt::lang_start (rt.rs:64)
             at main
     Summary Leaked 5 B total

Un-commenting the unsafe { CString::from_raw(ptr) }; re-takes the memory and frees it correctly. cargo valgrind run will compile the binary for you and won't detect a leak, since there is no leak anymore.

If you would like to pass flags to valgrind (for example to run an alternate subtool), you can set the VALGRINDFLAGS environment variable to a space-delimited list of valid Valgrind options.

Note: users of cargo-valgrind version 1.x should mind the changed command line. Previously there was a cargo valgrind subcommand, that replaced the cargo run or cargo test commands. Now the command line is cargo valgrind <command>, where <command> can be any normal cargo subcommand.

Installation

Requirements

You need to have valgrind installed and in the PATH (you can test this by running valgrind --help in your shell).

You'll also need to have cargo installed and in the PATH, but since this is a cargo subcommand, you will almost certainly have it already installed.

Install the binary

Run the following command to install from crates.io:

$ cargo install cargo-valgrind

This will install the latest official released version.

If you want to use the latest changes, that were not yet published to crates.io, you can install the binary from the git-repository like this:

$ cargo install --git https://github.com/jfrimmel/cargo-valgrind

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in cargo-valgrind by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

cargo-valgrind's People

Contributors

avuxo avatar jfrimmel avatar ki7dk avatar krystian-wojtas avatar luni-4 avatar thewastl avatar vhqtvn avatar web-flow avatar wiktor-k avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

cargo-valgrind's Issues

Stack Overflow causes valgrind to exit with error

If the program under test produces a stack overflow, the following output is printed:

    Finished dev [unoptimized + debuginfo] target(s) in 0.24s
   Analyzing `target/debug/huge_box`
==5113==  If you believe this happened as a result of a stack
==5113==  overflow in your program's main thread (unlikely but
==5113==  possible), you can try to increase the size of the
==5113==  main thread stack using the --main-stacksize= flag.
==5113==  The main thread stack size used in this run was 8388608.
==5113==  If you believe this happened as a result of a stack
==5113==  overflow in your program's main thread (unlikely but
==5113==  possible), you can try to increase the size of the
==5113==  main thread stack using the --main-stacksize= flag.
==5113==  The main thread stack size used in this run was 8388608.
error: valgrind command failed

Note, that the normal valgrind output is interleaved with the cargo-valgrind output. This should not happen. Even if valgrind fails, its error messages should be parsed and dispalyed in the custom style.

Investigating of how to suppress the valgrind stack overflow error is required.

Invalid Free causes parsing the valgrind output to fail

If you have an invalid free, cargo-valgrind currently exits with an error. This is due to a changed Valgrind XML:

<error>
  <unique>...</unique>
  <tid>...</tid>
  <kind>InvalidFree</kind>
  <what>Invalid free() / delete / delete[] / realloc()</what>
  <stack>...</stack>
  <auxwhat>Address 0x8c2b840 is 0 bytes inside a block of size 16 free'd</auxwhat>
  <stack>...</stack>
  <auxwhat>Block was alloc'd at</auxwhat>
  <stack>...</stack>
</error>

Note the multiple stack fields.

To resolve this error the stack Error structure has to be changed, so that it provides a vector of Stacks.
Since the valgrind_xml module is not public, the change won't not API breaking.

Sudo cargo valgrind

I need to test my bin by running it as sudo, but it doesn't work. Please, add possibility, to run final binary as sudo

Catch panics with custom hook

Currently, there are multiple ways to provoke a panic inside cargo-valgrind, e.g. #38. Instead of the normal Rust panic message, a custom hook should be set via std::panic::set_hook. This custom panic message should include

  • a more helpful message, that an internal error occurred, which is not an user error
  • that a bug should be reported using this issue tracker

Calling valgrind's profiling tools?

I wonder do you have any plans to support valgrind's callgrind and cachegrind?

I know that there's a cargo-profiler crate doing this, but the output from their tool doesn't contains enough information for me, I might write a better parser for callgrind and cachegrind output, but I'm more interested in contributing the parser to your tool.

Thanks!

Human-readable byte sizes

Currently the leaked memory is always given in bytes:

    Finished dev [unoptimized + debuginfo] target(s) in 0.35s
   Analyzing `target/debug/huge_box`
       Error Leaked 1048576 bytes
        Info at malloc (vg_replace_malloc.c:299)
             at alloc::alloc::alloc (alloc.rs:81)
             at alloc::alloc::exchange_malloc (alloc.rs:203)
             at new<[u8; 1048576]> (boxed.rs:113)
             at huge_box::main (main.rs:2)
             at std::rt::lang_start::{{closure}} (rt.rs:64)
             at {{closure}} (rt.rs:49)
             at std::panicking::try::do_call (panicking.rs:293)
             at __rust_maybe_catch_panic (lib.rs:85)
             at try<i32,closure> (panicking.rs:272)
             at catch_unwind<closure,i32> (panic.rs:394)
             at std::rt::lang_start_internal (rt.rs:48)
             at std::rt::lang_start (rt.rs:64)
             at main

It may be easier to read Leaked 1 MiB instead of Leaked 1048576 bytes.

The bytesize crate might be used.

bug

bug report.txt
main.txt

i introduced a bug to my main.rs (main.txt), and used cargo valgrind run to detect it, but it crashed instead.
Note: I used valgrind in a docker, so it might the issue, idk.

thanks

Print helpful error on deserialization error

There are some users reporting errors on "malformed" (i.e. in the sense of: unknown format) input, e.g. #32. Currently (version 2.0.0) the tool panics:

$ cargo valgrind run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `/home/jfrimmel/.cargo/bin/cargo-valgrind target/debug/ffi-bug`
Test
thread 'main' panicked at 'Cannot parse valgrind output: Error(Custom("missing field `xwhat`"), State { next_error: None })', src/main.rs:69:49
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

This is really unfortunate. This error should be handled gracefully, as it was done in the 1.x version. But instead of only writing, that there is an error, a more helpful output would be:

$ cargo valgrind run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `/home/jfrimmel/.cargo/bin/cargo-valgrind target/debug/ffi-bug`
Test

Internal error in `cargo valgrind`: encountered an unknown valgrind output.
Below you'll find the output of valgrind. It would be appreciated, if you create a bug-report using this output at 
https://github.com/jfrimmel/cargo-valgrind/issues/new

Allow passing flags to valgrind

The tool version 1.2.0, cargo valgrind supported some valgrind flags. This ability was removed in version 2.0.0, but should be re-introduced in version 2.1.0 (or any other future version).

I imagine passing the arguments via an environment variable like VALGRINDFLAGS (similar to RUSTFLAGS for cargo), as normal CLI flags are not possible (they would be passed to cargo instead of valgrind.

Fix clippy issues

Currently each PR has the following issue, which should be fixed:

Output of cargo clippy

    Checking cargo-valgrind v2.0.2 (/home/runner/work/cargo-valgrind/cargo-valgrind)
warning: consider adding a `;` to the last statement for consistent formatting
  --> src/panic.rs:76:13
   |
76 |             old_hook(panic)
   |             ^^^^^^^^^^^^^^^ help: add a `;` here: `old_hook(panic);`
   |
note: the lint level is defined here
  --> src/main.rs:9:5
   |
9  |     clippy::pedantic,
   |     ^^^^^^^^^^^^^^^^
   = note: `#[warn(clippy::semicolon_if_nothing_returned)]` implied by `#[warn(clippy::pedantic)]`
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#semicolon_if_nothing_returned

warning: this `impl` can be derived
   --> src/valgrind/xml/mod.rs:156:1
    |
156 | / impl Default for Resources {
157 | |     fn default() -> Self {
158 | |         Resources {
159 | |             bytes: 0,
...   |
162 | |     }
163 | | }
    | |_^
    |
note: the lint level is defined here
   --> src/main.rs:6:5
    |
6   |     clippy::complexity,
    |     ^^^^^^^^^^^^^^^^^^
    = note: `#[warn(clippy::derivable_impls)]` implied by `#[warn(clippy::complexity)]`
    = help: try annotating `valgrind::xml::Resources` with `#[derive(Default)]`
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls

warning: unnecessary structure name repetition
   --> src/valgrind/xml/mod.rs:158:9
    |
158 |         Resources {
    |         ^^^^^^^^^ help: use the applicable keyword: `Self`
    |
note: the lint level is defined here
   --> src/main.rs:8:5
    |
8   |     clippy::nursery,
    |     ^^^^^^^^^^^^^^^
    = note: `#[warn(clippy::use_self)]` implied by `#[warn(clippy::nursery)]`
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#use_self

warning: length comparison to zero
  --> src/valgrind/mod.rs:87:24
   |
87 |                     if new_err.len() > 0 {
   |                        ^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!new_err.is_empty()`
   |
note: the lint level is defined here
  --> src/main.rs:7:5
   |
7  |     clippy::style,
   |     ^^^^^^^^^^^^^
   = note: `#[warn(clippy::len_zero)]` implied by `#[warn(clippy::style)]`
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero

warning: consider adding a `;` to the last statement for consistent formatting
  --> src/valgrind/mod.rs:88:25
   |
88 |                         output.errors = Some(new_err)
   |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: add a `;` here: `output.errors = Some(new_err);`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#semicolon_if_nothing_returned

warning: consider adding a `;` to the last statement for consistent formatting
  --> src/valgrind/mod.rs:90:25
   |
90 |                         output.errors = None
   |                         ^^^^^^^^^^^^^^^^^^^^ help: add a `;` here: `output.errors = None;`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#semicolon_if_nothing_returned

warning: `cargo-valgrind` (bin "cargo-valgrind") generated 6 warnings
    Finished dev [unoptimized + debuginfo] target(s) in 1m 10s

If your PR introduced these issues, please try to address them.

Originally posted by @github-actions[bot] in #50 (comment)

failed to allocate a guard page

Hello,

I'm trying to use this crate but it give me this error:

thread '<unnamed>' panicked at 'failed to allocate a guard page', src/libstd/sys/unix/thread.rs:336:17
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
fatal runtime error: failed to initiate panic, error 94375168
error: valgrind command failed

I'm using:

  • FreeBSD 11.2
  • rustc 1.39.0
  • valgrind 3.10.1

cargo valgrind unexpectedly crashed (but may be misbehaving instrumented program)

Reporting this here, since cargo-valgrind asked me nicely to do so.

Project: https://github.com/barafael/crisp/tree/cargo-valgrind-bug. There is a note in main.rs with a possibly related call to free.

Gist of trace (because it's too long for GitHub issue): https://gist.github.com/barafael/8360ad9aa31fc747fd53568be2bb35cc

Steps to reproduce

  • Clone project on branch cargo-valgrind-bug
  • Run cargo valgrind run
  • Enter * 1 2
  • Hit CTRL-C

Not working on unit tests (missing field `xwhat`)

Hi. Really awesome project. I love how much simpler it is to check for memory leaks etc with this tool. However I'm not able to run this on my integration tests on a Fedora Linux machine. I'm not sure if Cargo changed in some incompatible way or if I have an unsupported version of valgrind?

This is the software I'm running:

$ valgrind --version
valgrind-3.15.0
$ cargo valgrind --version
cargo-valgrind 1.3.0
$ cargo --version
cargo 1.43.0 (3532cf738 2020-03-17)

And this is the issue I'm getting:

$ cargo valgrind --test all_tests
...
error: Could not parse XML: custom: 'missing field `xwhat`'

Cargo valgrind crashed while running tests.

Thank you for an excellent tool!

As I was running this on our integration tests I experienced a crash with the following message:

cargo-valgrind: version 2.0.3
XML format mismatch between `valgrind` and `cargo valgrind`: custom: duplicate field `stack`
XML output of valgrind:
```xml
<?xml version="1.0"?>

<valgrindoutput>

<protocolversion>4</protocolversion>
<protocoltool>memcheck</protocoltool>

<preamble>
  <line>Memcheck, a memory error detector</line>
  <line>Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.</line>
  <line>Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info</line>
  <line>Command: /home/hepper/workspace/rust-tss-esapi/target/debug/deps/integration_tests-2d5723b6547f6cbb --test-threads=1 --nocapture</line>
</preamble>

<pid>9946</pid>
<ppid>9945</ppid>
<tool>memcheck</tool>

<args>
  <vargv>
    <exe>/usr/bin/valgrind.bin</exe>
    <arg>--xml=yes</arg>
    <arg>--xml-socket=127.0.0.1:41415</arg>
  </vargv>
  <argv>
    <exe>/home/hepper/workspace/rust-tss-esapi/target/debug/deps/integration_tests-2d5723b6547f6cbb</exe>
    <arg>--test-threads=1</arg>
    <arg>--nocapture</arg>
  </argv>
</args>

<status>
  <state>RUNNING</state>
  <time>00:00:00:01.897 </time>
</status>

Deserialization error when there are both errors while running and errors detected after program finishes

Minimal example:

use std::alloc::{Layout, alloc};

fn main() {
        unsafe {
                let ptr = alloc(Layout::new::<u8>());
                if *ptr == 0 { println!("dummy"); }
        }
}

Version info:

  • cargo-valgrind: 2.0.3
  • valgrind: 3.18.1

The problem seems to be that other XML elements (<status>) appear between <error> elements.

XML format mismatch between valgrind and cargo valgrind: custom: duplicate field error
XML output of valgrind:

<?xml version="1.0"?>

<valgrindoutput>

<protocolversion>4</protocolversion>
<protocoltool>memcheck</protocoltool>

<preamble>
  <line>Memcheck, a memory error detector</line>
  <line>Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.</line>
  <line>Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info</line>
  <line>Command: target/debug/break-valgrind</line>
</preamble>

<pid>78245</pid>
<ppid>78243</ppid>
<tool>memcheck</tool>

<args>
  <vargv>
    <exe>/usr/bin/valgrind.bin</exe>
    <arg>--xml=yes</arg>
    <arg>--xml-socket=127.0.0.1:43083</arg>
  </vargv>
  <argv>
    <exe>target/debug/break-valgrind</exe>
  </argv>
</args>

<status>
  <state>RUNNING</state>
  <time>00:00:00:00.315 </time>
</status>

<error>
  <unique>0x0</unique>
  <tid>1</tid>
  <kind>UninitCondition</kind>
  <what>Conditional jump or move depends on uninitialised value(s)</what>
  <stack>
    <frame>
      <ip>0x110992</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>break_valgrind::main</fn>
      <dir>/home/wastl/break-valgrind/src</dir>
      <file>main.rs</file>
      <line>7</line>
    </frame>
    <frame>
      <ip>0x1107EA</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>core::ops::function::FnOnce::call_once</fn>
      <dir>/rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>227</line>
    </frame>
    <frame>
      <ip>0x1106BD</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>std::sys_common::backtrace::__rust_begin_short_backtrace</fn>
      <dir>/rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/sys_common</dir>
      <file>backtrace.rs</file>
      <line>123</line>
    </frame>
    <frame>
      <ip>0x110750</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>std::rt::lang_start::{{closure}}</fn>
      <dir>/rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src</dir>
      <file>rt.rs</file>
      <line>145</line>
    </frame>
    <frame>
      <ip>0x125ABA</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>std::rt::lang_start_internal</fn>
      <dir>/rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>259</line>
    </frame>
    <frame>
      <ip>0x11071F</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>std::rt::lang_start</fn>
      <dir>/rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src</dir>
      <file>rt.rs</file>
      <line>144</line>
    </frame>
    <frame>
      <ip>0x1109EB</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>main</fn>
    </frame>
  </stack>
</error>


<status>
  <state>FINISHED</state>
  <time>00:00:00:01.350 </time>
</status>

<error>
  <unique>0x1</unique>
  <tid>1</tid>
  <kind>Leak_DefinitelyLost</kind>
  <xwhat>
    <text>1 bytes in 1 blocks are definitely lost in loss record 1 of 1</text>
    <leakedbytes>1</leakedbytes>
    <leakedblocks>1</leakedblocks>
  </xwhat>
  <stack>
    <frame>
      <ip>0x483F7B5</ip>
      <obj>/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so</obj>
      <fn>malloc</fn>
      <dir>./coregrind/m_replacemalloc</dir>
      <file>vg_replace_malloc.c</file>
      <line>381</line>
    </frame>
    <frame>
      <ip>0x1107AB</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>alloc::alloc::alloc</fn>
      <dir>/rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/alloc/src</dir>
      <file>alloc.rs</file>
      <line>87</line>
    </frame>
    <frame>
      <ip>0x110981</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>break_valgrind::main</fn>
      <dir>/home/wastl/break-valgrind/src</dir>
      <file>main.rs</file>
      <line>6</line>
    </frame>
    <frame>
      <ip>0x1107EA</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>core::ops::function::FnOnce::call_once</fn>
      <dir>/rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>227</line>
    </frame>
    <frame>
      <ip>0x1106BD</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>std::sys_common::backtrace::__rust_begin_short_backtrace</fn>
      <dir>/rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/sys_common</dir>
      <file>backtrace.rs</file>
      <line>123</line>
    </frame>
    <frame>
      <ip>0x110750</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>std::rt::lang_start::{{closure}}</fn>
      <dir>/rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src</dir>
      <file>rt.rs</file>
      <line>145</line>
    </frame>
    <frame>
      <ip>0x125ABA</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>std::rt::lang_start_internal</fn>
      <dir>/rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>259</line>
    </frame>
    <frame>
      <ip>0x11071F</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>std::rt::lang_start</fn>
      <dir>/rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src</dir>
      <file>rt.rs</file>
      <line>144</line>
    </frame>
    <frame>
      <ip>0x1109EB</ip>
      <obj>/home/wastl/break-valgrind/target/debug/break-valgrind</obj>
      <fn>main</fn>
    </frame>
  </stack>
</error>

<errorcounts>
  <pair>
    <count>1</count>
    <unique>0x0</unique>
  </pair>
</errorcounts>

<suppcounts>
</suppcounts>

</valgrindoutput>

Add drop guard to prevent running child process

As noted in this line:

// TODO: use drop guard, that waits on child in order to prevent printing to stdout of the child

the program needs a drop guard for cases, when the main program dies (e.g. it was killed with Ctrl+C). The current behavior is, that the program exits, but the valgrind child-process remains alive and prints to the standard output of the main process.

Unclear error when the valgrind executable is not found

I have some tests which require sudo to run.
When running with sudo you lose the path of your current user (which is expected).
I installed valgrind using linuxbrew so it shouldn't be on the standard path.
Instead of a clear error message indicating that valgrind cannot be found or similar all we get is error: No such file or directory (os error 2).
This requires the user to guess what went wrong.

Panic when invoking cargo valgrind

I have a project which uses rust-bindgen.
It seems like it is not supported by this command somehow.
In any case, panicking does not count as a clear error that indicates what's wrong and how to fix it.

RUST_BACKTRACE=full cargo valgrind
thread 'main' panicked at 'not yet implemented', /home/omer/.cargo/registry/src/github.com-1ecc6299db9ec823/cargo-valgrind-1.2.0/src/lib.rs:641:83
stack backtrace:
   0:     0x55cdadef1474 - backtrace::backtrace::libunwind::trace::h4dc2f373699fbe93
                               at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.37/src/backtrace/libunwind.rs:88
   1:     0x55cdadef1474 - backtrace::backtrace::trace_unsynchronized::h7b04f002610ccc35
                               at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.37/src/backtrace/mod.rs:66
   2:     0x55cdadef1474 - std::sys_common::backtrace::_print_fmt::h0238c0a72ffc5be3
                               at src/libstd/sys_common/backtrace.rs:76
   3:     0x55cdadef1474 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h40ab018276d013f4
                               at src/libstd/sys_common/backtrace.rs:60
   4:     0x55cdadf156dc - core::fmt::write::h029a8d927db7b721
                               at src/libcore/fmt/mod.rs:1030
   5:     0x55cdadeed807 - std::io::Write::write_fmt::ha386135dc33cd74f
                               at src/libstd/io/mod.rs:1412
   6:     0x55cdadef3855 - std::sys_common::backtrace::_print::he925af2d0a3180ad
                               at src/libstd/sys_common/backtrace.rs:64
   7:     0x55cdadef3855 - std::sys_common::backtrace::print::ha41b6194bcf8f6ce
                               at src/libstd/sys_common/backtrace.rs:49
   8:     0x55cdadef3855 - std::panicking::default_hook::{{closure}}::h659784bc3ca43626
                               at src/libstd/panicking.rs:196
   9:     0x55cdadef3546 - std::panicking::default_hook::h2f638ec54806c9d8
                               at src/libstd/panicking.rs:210
  10:     0x55cdadef3ef5 - std::panicking::rust_panic_with_hook::h12d7650e86d2fcb0
                               at src/libstd/panicking.rs:473
  11:     0x55cdade67625 - std::panicking::begin_panic::h1bc0c6165771a9ad
  12:     0x55cdade4af80 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &mut F>::call_once::h03ba4698face0b56
  13:     0x55cdade57107 - <core::iter::adapters::Map<I,F> as core::iter::traits::iterator::Iterator>::next::he09a78cc682c470e
  14:     0x55cdade53eb4 - <core::iter::adapters::flatten::FlatMap<I,U,F> as core::iter::traits::iterator::Iterator>::next::h27e593f28491c9f6
  15:     0x55cdade56811 - <alloc::vec::Vec<T> as alloc::vec::SpecExtend<T,I>>::from_iter::h36558778d1bacfb3
  16:     0x55cdade4a113 - cargo_valgrind::targets::hbd7da8ddd042f593
  17:     0x55cdade6b7d8 - cargo_valgrind::run::hb5ac550d958cc5e7
  18:     0x55cdade6e3d2 - cargo_valgrind::main::h66226763dd24eedb
  19:     0x55cdade50943 - std::rt::lang_start::{{closure}}::h06707b789db1cb0c
  20:     0x55cdadef3923 - std::rt::lang_start_internal::{{closure}}::h1e233f1ef686736e
                               at src/libstd/rt.rs:49
  21:     0x55cdadef3923 - std::panicking::try::do_call::h0eae6d7a87b4dd98
                               at src/libstd/panicking.rs:292
  22:     0x55cdadefa66a - __rust_maybe_catch_panic
                               at src/libpanic_unwind/lib.rs:80
  23:     0x55cdadef43ed - std::panicking::try::h496030de30818333
                               at src/libstd/panicking.rs:271
  24:     0x55cdadef43ed - std::panic::catch_unwind::h9f715533e260dcba
                               at src/libstd/panic.rs:394
  25:     0x55cdadef43ed - std::rt::lang_start_internal::h8832b9e1d5618fb5
                               at src/libstd/rt.rs:48
  26:     0x55cdade6e532 - main
  27:     0x7f0571ed8b97 - __libc_start_main
  28:     0x55cdade3f16a - _start
  29:                0x0 - <unknown

Oooops. cargo valgrind unexpectedly crashed. This is a bug!

Hi There,

I was working with your nice tool and got a message saying that I should submit an issue. Here you are (huge XML follows).

This is my project/branch https://github.com/cpmech/tritet/tree/issue-with-cargo-valgrind

To reproduce the issue, you may run cargo valgrind run --bin mem_check_build

But I may be doing something wrong! LOL

By the way, there is a double-free issue in my code that I deliberately let happen to verify that Valgrind captures it.

Cheers.
Dorival

cargo-valgrind: version 2.0.3
XML format mismatch between valgrind and cargo valgrind: custom: duplicate field stack
XML output of valgrind:

<?xml version="1.0"?>

<valgrindoutput>

<protocolversion>4</protocolversion>
<protocoltool>memcheck</protocoltool>

<preamble>
  <line>Memcheck, a memory error detector</line>
  <line>Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.</line>
  <line>Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info</line>
  <line>Command: /home/dorival/rust_modules/debug/mem_check_build</line>
</preamble>

<pid>3596</pid>
<ppid>3593</ppid>
<tool>memcheck</tool>

<args>
  <vargv>
    <exe>/usr/bin/valgrind.bin</exe>
    <arg>--xml=yes</arg>
    <arg>--xml-socket=127.0.0.1:39543</arg>
  </vargv>
  <argv>
    <exe>/home/dorival/rust_modules/debug/mem_check_build</exe>
  </argv>
</args>

<status>
  <state>RUNNING</state>
  <time>00:00:00:00.104 </time>
</status>

<error>
  <unique>0x0</unique>
  <tid>1</tid>
  <kind>UninitCondition</kind>
  <what>Conditional jump or move depends on uninitialised value(s)</what>
  <stack>
    <frame>
      <ip>0x13D8AE</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>carveholes</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>13073</line>
    </frame>
    <frame>
      <ip>0x142D94</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>triangulate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>15808</line>
    </frame>
    <frame>
      <ip>0x1112E9</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>interface_triangle.h</file>
      <line>217</line>
    </frame>
    <frame>
      <ip>0x110B5B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>tritet::triangle::Triangle::generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src</dir>
      <file>triangle.rs</file>
      <line>161</line>
    </frame>
    <frame>
      <ip>0x11004F</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>mem_check_build::main</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src/bin</dir>
      <file>mem_check_build.rs</file>
      <line>14</line>
    </frame>
    <frame>
      <ip>0x1105FA</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>core::ops::function::FnOnce::call_once</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>248</line>
    </frame>
    <frame>
      <ip>0x11057D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::sys_common::backtrace::__rust_begin_short_backtrace</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src/sys_common</dir>
      <file>backtrace.rs</file>
      <line>122</line>
    </frame>
    <frame>
      <ip>0x1106F0</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start::{{closure}}</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>145</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>call_once&lt;(), (dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>280</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;i32, &amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>{closure#2}</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;isize, std::rt::lang_start_internal::{closure_env#2}&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start_internal</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x1106BF</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>144</line>
    </frame>
    <frame>
      <ip>0x11012B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>main</fn>
    </frame>
  </stack>
</error>

<error>
  <unique>0x1</unique>
  <tid>1</tid>
  <kind>UninitCondition</kind>
  <what>Conditional jump or move depends on uninitialised value(s)</what>
  <stack>
    <frame>
      <ip>0x13D8E2</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>carveholes</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>13073</line>
    </frame>
    <frame>
      <ip>0x142D94</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>triangulate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>15808</line>
    </frame>
    <frame>
      <ip>0x1112E9</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>interface_triangle.h</file>
      <line>217</line>
    </frame>
    <frame>
      <ip>0x110B5B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>tritet::triangle::Triangle::generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src</dir>
      <file>triangle.rs</file>
      <line>161</line>
    </frame>
    <frame>
      <ip>0x11004F</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>mem_check_build::main</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src/bin</dir>
      <file>mem_check_build.rs</file>
      <line>14</line>
    </frame>
    <frame>
      <ip>0x1105FA</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>core::ops::function::FnOnce::call_once</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>248</line>
    </frame>
    <frame>
      <ip>0x11057D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::sys_common::backtrace::__rust_begin_short_backtrace</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src/sys_common</dir>
      <file>backtrace.rs</file>
      <line>122</line>
    </frame>
    <frame>
      <ip>0x1106F0</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start::{{closure}}</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>145</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>call_once&lt;(), (dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>280</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;i32, &amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>{closure#2}</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;isize, std::rt::lang_start_internal::{closure_env#2}&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start_internal</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x1106BF</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>144</line>
    </frame>
    <frame>
      <ip>0x11012B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>main</fn>
    </frame>
  </stack>
</error>

<error>
  <unique>0x2</unique>
  <tid>1</tid>
  <kind>UninitCondition</kind>
  <what>Conditional jump or move depends on uninitialised value(s)</what>
  <stack>
    <frame>
      <ip>0x13D91A</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>carveholes</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>13073</line>
    </frame>
    <frame>
      <ip>0x142D94</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>triangulate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>15808</line>
    </frame>
    <frame>
      <ip>0x1112E9</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>interface_triangle.h</file>
      <line>217</line>
    </frame>
    <frame>
      <ip>0x110B5B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>tritet::triangle::Triangle::generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src</dir>
      <file>triangle.rs</file>
      <line>161</line>
    </frame>
    <frame>
      <ip>0x11004F</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>mem_check_build::main</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src/bin</dir>
      <file>mem_check_build.rs</file>
      <line>14</line>
    </frame>
    <frame>
      <ip>0x1105FA</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>core::ops::function::FnOnce::call_once</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>248</line>
    </frame>
    <frame>
      <ip>0x11057D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::sys_common::backtrace::__rust_begin_short_backtrace</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src/sys_common</dir>
      <file>backtrace.rs</file>
      <line>122</line>
    </frame>
    <frame>
      <ip>0x1106F0</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start::{{closure}}</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>145</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>call_once&lt;(), (dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>280</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;i32, &amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>{closure#2}</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;isize, std::rt::lang_start_internal::{closure_env#2}&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start_internal</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x1106BF</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>144</line>
    </frame>
    <frame>
      <ip>0x11012B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>main</fn>
    </frame>
  </stack>
</error>

<error>
  <unique>0x3</unique>
  <tid>1</tid>
  <kind>UninitCondition</kind>
  <what>Conditional jump or move depends on uninitialised value(s)</what>
  <stack>
    <frame>
      <ip>0x13D952</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>carveholes</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>13074</line>
    </frame>
    <frame>
      <ip>0x142D94</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>triangulate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>15808</line>
    </frame>
    <frame>
      <ip>0x1112E9</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>interface_triangle.h</file>
      <line>217</line>
    </frame>
    <frame>
      <ip>0x110B5B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>tritet::triangle::Triangle::generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src</dir>
      <file>triangle.rs</file>
      <line>161</line>
    </frame>
    <frame>
      <ip>0x11004F</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>mem_check_build::main</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src/bin</dir>
      <file>mem_check_build.rs</file>
      <line>14</line>
    </frame>
    <frame>
      <ip>0x1105FA</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>core::ops::function::FnOnce::call_once</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>248</line>
    </frame>
    <frame>
      <ip>0x11057D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::sys_common::backtrace::__rust_begin_short_backtrace</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src/sys_common</dir>
      <file>backtrace.rs</file>
      <line>122</line>
    </frame>
    <frame>
      <ip>0x1106F0</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start::{{closure}}</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>145</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>call_once&lt;(), (dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>280</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;i32, &amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>{closure#2}</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;isize, std::rt::lang_start_internal::{closure_env#2}&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start_internal</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x1106BF</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>144</line>
    </frame>
    <frame>
      <ip>0x11012B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>main</fn>
    </frame>
  </stack>
</error>

<error>
  <unique>0x4</unique>
  <tid>1</tid>
  <kind>UninitCondition</kind>
  <what>Conditional jump or move depends on uninitialised value(s)</what>
  <stack>
    <frame>
      <ip>0x116DE6</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>counterclockwise</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>5263</line>
    </frame>
    <frame>
      <ip>0x13DA2B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>carveholes</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>13085</line>
    </frame>
    <frame>
      <ip>0x142D94</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>triangulate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>15808</line>
    </frame>
    <frame>
      <ip>0x1112E9</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>interface_triangle.h</file>
      <line>217</line>
    </frame>
    <frame>
      <ip>0x110B5B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>tritet::triangle::Triangle::generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src</dir>
      <file>triangle.rs</file>
      <line>161</line>
    </frame>
    <frame>
      <ip>0x11004F</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>mem_check_build::main</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src/bin</dir>
      <file>mem_check_build.rs</file>
      <line>14</line>
    </frame>
    <frame>
      <ip>0x1105FA</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>core::ops::function::FnOnce::call_once</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>248</line>
    </frame>
    <frame>
      <ip>0x11057D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::sys_common::backtrace::__rust_begin_short_backtrace</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src/sys_common</dir>
      <file>backtrace.rs</file>
      <line>122</line>
    </frame>
    <frame>
      <ip>0x1106F0</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start::{{closure}}</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>145</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>call_once&lt;(), (dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>280</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;i32, &amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>{closure#2}</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;isize, std::rt::lang_start_internal::{closure_env#2}&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start_internal</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x1106BF</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>144</line>
    </frame>
    <frame>
      <ip>0x11012B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>main</fn>
    </frame>
  </stack>
</error>

<error>
  <unique>0x5</unique>
  <tid>1</tid>
  <kind>UninitCondition</kind>
  <what>Conditional jump or move depends on uninitialised value(s)</what>
  <stack>
    <frame>
      <ip>0x116E16</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>counterclockwise</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>5269</line>
    </frame>
    <frame>
      <ip>0x13DA2B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>carveholes</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>13085</line>
    </frame>
    <frame>
      <ip>0x142D94</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>triangulate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>15808</line>
    </frame>
    <frame>
      <ip>0x1112E9</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>interface_triangle.h</file>
      <line>217</line>
    </frame>
    <frame>
      <ip>0x110B5B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>tritet::triangle::Triangle::generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src</dir>
      <file>triangle.rs</file>
      <line>161</line>
    </frame>
    <frame>
      <ip>0x11004F</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>mem_check_build::main</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src/bin</dir>
      <file>mem_check_build.rs</file>
      <line>14</line>
    </frame>
    <frame>
      <ip>0x1105FA</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>core::ops::function::FnOnce::call_once</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>248</line>
    </frame>
    <frame>
      <ip>0x11057D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::sys_common::backtrace::__rust_begin_short_backtrace</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src/sys_common</dir>
      <file>backtrace.rs</file>
      <line>122</line>
    </frame>
    <frame>
      <ip>0x1106F0</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start::{{closure}}</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>145</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>call_once&lt;(), (dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>280</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;i32, &amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>{closure#2}</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;isize, std::rt::lang_start_internal::{closure_env#2}&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start_internal</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x1106BF</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>144</line>
    </frame>
    <frame>
      <ip>0x11012B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>main</fn>
    </frame>
  </stack>
</error>

<error>
  <unique>0x6</unique>
  <tid>1</tid>
  <kind>UninitCondition</kind>
  <what>Conditional jump or move depends on uninitialised value(s)</what>
  <stack>
    <frame>
      <ip>0x13DA34</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>carveholes</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>13085</line>
    </frame>
    <frame>
      <ip>0x142D94</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>triangulate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>triangle.c</file>
      <line>15808</line>
    </frame>
    <frame>
      <ip>0x1112E9</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>interface_triangle.h</file>
      <line>217</line>
    </frame>
    <frame>
      <ip>0x110B5B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>tritet::triangle::Triangle::generate</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src</dir>
      <file>triangle.rs</file>
      <line>161</line>
    </frame>
    <frame>
      <ip>0x11004F</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>mem_check_build::main</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src/bin</dir>
      <file>mem_check_build.rs</file>
      <line>14</line>
    </frame>
    <frame>
      <ip>0x1105FA</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>core::ops::function::FnOnce::call_once</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>248</line>
    </frame>
    <frame>
      <ip>0x11057D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::sys_common::backtrace::__rust_begin_short_backtrace</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src/sys_common</dir>
      <file>backtrace.rs</file>
      <line>122</line>
    </frame>
    <frame>
      <ip>0x1106F0</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start::{{closure}}</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>145</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>call_once&lt;(), (dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>280</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;i32, &amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>{closure#2}</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;isize, std::rt::lang_start_internal::{closure_env#2}&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start_internal</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x1106BF</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>144</line>
    </frame>
    <frame>
      <ip>0x11012B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>main</fn>
    </frame>
  </stack>
</error>

<error>
  <unique>0x7</unique>
  <tid>1</tid>
  <kind>InvalidFree</kind>
  <what>Invalid free() / delete / delete[] / realloc()</what>
  <stack>
    <frame>
      <ip>0x483CA3F</ip>
      <obj>/usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so</obj>
      <fn>free</fn>
    </frame>
    <frame>
      <ip>0x110F36</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>free_data</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>interface_triangle.h</file>
      <line>103</line>
    </frame>
    <frame>
      <ip>0x1111E3</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>drop_triangle</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>interface_triangle.h</file>
      <line>181</line>
    </frame>
    <frame>
      <ip>0x11079D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>&lt;tritet::triangle::Triangle as core::ops::drop::Drop&gt;::drop</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src</dir>
      <file>triangle.rs</file>
      <line>200</line>
    </frame>
    <frame>
      <ip>0x11068A</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>core::ptr::drop_in_place&lt;tritet::triangle::Triangle&gt;</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ptr</dir>
      <file>mod.rs</file>
      <line>487</line>
    </frame>
    <frame>
      <ip>0x1100F0</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>mem_check_build::main</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src/bin</dir>
      <file>mem_check_build.rs</file>
      <line>17</line>
    </frame>
    <frame>
      <ip>0x1105FA</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>core::ops::function::FnOnce::call_once</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>248</line>
    </frame>
    <frame>
      <ip>0x11057D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::sys_common::backtrace::__rust_begin_short_backtrace</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src/sys_common</dir>
      <file>backtrace.rs</file>
      <line>122</line>
    </frame>
    <frame>
      <ip>0x1106F0</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start::{{closure}}</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>145</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>call_once&lt;(), (dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>280</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;i32, &amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>{closure#2}</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;isize, std::rt::lang_start_internal::{closure_env#2}&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start_internal</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x1106BF</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>144</line>
    </frame>
    <frame>
      <ip>0x11012B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>main</fn>
    </frame>
  </stack>
  <auxwhat>Address 0x4bf70b0 is 0 bytes inside a block of size 32 free'd</auxwhat>
  <stack>
    <frame>
      <ip>0x483CA3F</ip>
      <obj>/usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so</obj>
      <fn>free</fn>
    </frame>
    <frame>
      <ip>0x110F36</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>free_data</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>interface_triangle.h</file>
      <line>103</line>
    </frame>
    <frame>
      <ip>0x1111D1</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>drop_triangle</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>interface_triangle.h</file>
      <line>180</line>
    </frame>
    <frame>
      <ip>0x11079D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>&lt;tritet::triangle::Triangle as core::ops::drop::Drop&gt;::drop</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src</dir>
      <file>triangle.rs</file>
      <line>200</line>
    </frame>
    <frame>
      <ip>0x11068A</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>core::ptr::drop_in_place&lt;tritet::triangle::Triangle&gt;</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ptr</dir>
      <file>mod.rs</file>
      <line>487</line>
    </frame>
    <frame>
      <ip>0x1100F0</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>mem_check_build::main</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src/bin</dir>
      <file>mem_check_build.rs</file>
      <line>17</line>
    </frame>
    <frame>
      <ip>0x1105FA</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>core::ops::function::FnOnce::call_once</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>248</line>
    </frame>
    <frame>
      <ip>0x11057D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::sys_common::backtrace::__rust_begin_short_backtrace</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src/sys_common</dir>
      <file>backtrace.rs</file>
      <line>122</line>
    </frame>
    <frame>
      <ip>0x1106F0</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start::{{closure}}</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>145</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>call_once&lt;(), (dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>280</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;i32, &amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>{closure#2}</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;isize, std::rt::lang_start_internal::{closure_env#2}&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start_internal</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x1106BF</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>144</line>
    </frame>
    <frame>
      <ip>0x11012B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>main</fn>
    </frame>
  </stack>
  <auxwhat>Block was alloc'd at</auxwhat>
  <stack>
    <frame>
      <ip>0x483B7F3</ip>
      <obj>/usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so</obj>
      <fn>malloc</fn>
    </frame>
    <frame>
      <ip>0x1110C0</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>new_triangle</fn>
      <dir>/home/dorival/01-Code/rust/tritet/c_code</dir>
      <file>interface_triangle.h</file>
      <line>148</line>
    </frame>
    <frame>
      <ip>0x110894</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>tritet::triangle::Triangle::new</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src</dir>
      <file>triangle.rs</file>
      <line>66</line>
    </frame>
    <frame>
      <ip>0x10FB33</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>mem_check_build::main</fn>
      <dir>/home/dorival/01-Code/rust/tritet/src/bin</dir>
      <file>mem_check_build.rs</file>
      <line>5</line>
    </frame>
    <frame>
      <ip>0x1105FA</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>core::ops::function::FnOnce::call_once</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>248</line>
    </frame>
    <frame>
      <ip>0x11057D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::sys_common::backtrace::__rust_begin_short_backtrace</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src/sys_common</dir>
      <file>backtrace.rs</file>
      <line>122</line>
    </frame>
    <frame>
      <ip>0x1106F0</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start::{{closure}}</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>145</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>call_once&lt;(), (dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/core/src/ops</dir>
      <file>function.rs</file>
      <line>280</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;i32, &amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;&amp;(dyn core::ops::function::Fn&lt;(), Output=i32&gt; + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>{closure#2}</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>do_call&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>492</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>try&lt;isize, std::rt::lang_start_internal::{closure_env#2}&gt;</fn>
      <dir>library/std/src</dir>
      <file>panicking.rs</file>
      <line>456</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>catch_unwind&lt;std::rt::lang_start_internal::{closure_env#2}, isize&gt;</fn>
      <dir>library/std/src</dir>
      <file>panic.rs</file>
      <line>137</line>
    </frame>
    <frame>
      <ip>0x15520D</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start_internal</fn>
      <dir>library/std/src</dir>
      <file>rt.rs</file>
      <line>128</line>
    </frame>
    <frame>
      <ip>0x1106BF</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>std::rt::lang_start</fn>
      <dir>/rustc/99930ac7f8cbb5d9b319b2e2e92794fd6f24f556/library/std/src</dir>
      <file>rt.rs</file>
      <line>144</line>
    </frame>
    <frame>
      <ip>0x11012B</ip>
      <obj>/home/dorival/rust_modules/debug/mem_check_build</obj>
      <fn>main</fn>
    </frame>
  </stack>
</error>


<status>
  <state>FINISHED</state>
  <time>00:00:00:00.627 </time>
</status>

<errorcounts>
  <pair>
    <count>1</count>
    <unique>0x7</unique>
  </pair>
  <pair>
    <count>1</count>
    <unique>0x6</unique>
  </pair>
  <pair>
    <count>1</count>
    <unique>0x5</unique>
  </pair>
  <pair>
    <count>1</count>
    <unique>0x4</unique>
  </pair>
  <pair>
    <count>1</count>
    <unique>0x3</unique>
  </pair>
  <pair>
    <count>1</count>
    <unique>0x2</unique>
  </pair>
  <pair>
    <count>1</count>
    <unique>0x1</unique>
  </pair>
  <pair>
    <count>1</count>
    <unique>0x0</unique>
  </pair>
</errorcounts>

<suppcounts>
</suppcounts>

</valgrindoutput>

Re-enable and fix clippy in CI

See #59 for reasons, why it is disabled. We need a different way of communicating the issues to the user, even if there are no read permissions.

Handle non-installed valgrind gracefully

In the 2.0.0 version of this crate, there is a plain panic, if valgrind is not installed or can otherwise not be run This is due to this lines (the .expect()):

let mut cargo = Command::new("valgrind")
.arg("--xml=yes")
.arg(format!("--xml-socket={}:{}", address.ip(), address.port()))
.args(command)
.spawn()
.expect("Valgrind is not installed or cannot be started");

It would be better to gracefully handle that case and print a user error, optionally with install instructions, e.g.:

$ cargo valgrind run; echo $?
error: `valgrind` is not installed, please install valgrind via your package manager.
127

Passing environment variables

Hello, thank your for your project.

I am encountering an issue where my program relies on the crate env_logger. It will respect my session's RUST_LOG variable and what logs to show, but this program seems to be ignoring the variable.

When spawning a new process, could cargo-valgrind move the environment variables over to the child so that I can control the logger?

Clippy comment contains no information

See the output below. This is not optimal, as the dependencies lead to additional lines, which cause the output file to cross the length threshold.

Output of cargo clippy

    Updating crates.io index
 Downloading crates ...
  Downloaded terminal_size v0.1.16
  Downloaded textwrap v0.13.4
  Downloaded unicode-width v0.1.8
  Downloaded lazy_static v1.4.0
  Downloaded unicode-xid v0.2.0
  Downloaded quote v1.0.3
  Downloaded proc-macro2 v1.0.9
  Downloaded error-chain v0.10.0
  Downloaded colored v1.9.3
  Downloaded cfg-if v0.1.10
  Downloaded serde v1.0.105
  Downloaded serde_derive v1.0.105
  Downloaded libc v0.2.68
  Downloaded log v0.4.8
  Downloaded bytesize v1.0.0
  Downloaded atty v0.2.14
  Downloaded serde-xml-rs v0.3.1
  Downloaded syn v1.0.17
  Downloaded xml-rs v0.8.0
  Downloaded smawk v0.3.1
   Compiling proc-macro2 v1.0.9
   Compiling libc v0.2.68
   Compiling unicode-xid v0.2.0
   Compiling syn v1.0.17
   Compiling log v0.4.8
   Compiling serde v1.0.105
    Checking cfg-if v0.1.10
    Checking lazy_static v1.4.0
    Checking xml-rs v0.8.0
    Checking error-chain v0.10.0
    Checking unicode-width v0.1.8
    Checking smawk v0.3.1
    Checking bytesize v1.0.0
   Compiling quote v1.0.3
    Checking atty v0.2.14
    Checking terminal_size v0.1.16
    Checking colored v1.9.3
    Checking textwrap v0.13.4
   Compiling serde_derive v1.0.105
    Checking serde-xml-rs v0.3.1
    Checking cargo-valgrind v2.0.1 (/home/runner/work/cargo-valgrind/cargo-valgrind)
    Finished dev [unoptimized + debuginfo] target(s) in 36.22s

If your PR introduced these issues, please try to address them.

Originally posted by @github-actions[bot] in #45 (comment)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.