¿Por qué kcov calcula estadísticas de cobertura de código incorrectas para programas Rust?

He tratado de usarkcov para obtener cobertura de código para una biblioteca Rust. He seguidoeste tutorial para construir y usar kcov. La cobertura parece funcionar, sin embargo, me enfrento a una alta cobertura extraña. ¡Algunos archivos en el proyecto obtienen una cobertura del 100%, incluso si en realidad no están cubiertos en absoluto!

Este es un proyecto mínimo que reproduce el problema:

Cargo.toml

[package]
name = "mypackage"
version = "0.1.0"
authors = ["mbrt"]

src / lib.rs

pub mod subm;

pub fn coverage1(i : bool) -> bool {
    if i {
        true
    }
    else {
        false
    }
}

#[cfg(test)]
mod test {
    use super::coverage1;

    #[test]
    fn test_coverage1() {
        assert!(coverage1(true));
    }
}

src / subm.rs

pub fn coverage2(i : bool) -> bool {
    if i {
        true
    }
    else {
        false
    }
}

#[cfg(test)]
mod test {
    #[test]
    fn test_coverage2() {
    }
}

Hay dos funciones idénticas, una en la raíz de la caja y otra en un submódulo. La única diferencia es que la primera prueba estimula una función y la otra no hace nada. En este caso, esperaría una cobertura no mayor al 50%.

sin embargokcov informa esto:

La cobertura paralib.rs es correcto:

Pero la cobertura desubm.rs ¡Está Mal! Tenga en cuenta que la función es pública, por lo que no se puede optimizar desde la biblioteca:

Aquí podemos verificar quekcov está funcionando, porque puede calcular la cobertura de código para un archivo, pero no puede ver que el segundo archivo no está cubierto en absoluto.

¿Cuál es el problema aquí? ¿Quizás los binarios de prueba eliminan las funciones no utilizadas y kcov no puede verlas?

Respuestas a la pregunta(2)

Su respuesta a la pregunta