2014-10-30 4 views
5

원시 포인터를 조작하는 녹 코드를 쓰고 있습니다. 그런 다음이 원시 포인터는 ContravariantLifetime을 사용하는 구조체를 통해 사용자에게 노출되어 구조체의 수명이 내 객체와 연결됩니다.유효 기간이 만료되었는지 테스트 할 수 있습니까?

사용자 지향 구조가 내 개체보다 오래 살 수 없음을 확인하는 테스트를 작성하고 싶습니다. 나는 다음과 같은 코드를 가지고있다 :

fn element_cannot_outlive_parts() { 
    let mut z = { 
     let p = Package::new(); 
     p.create() // returns an object that cannot live longer than p 
    }; 
} 

이것은 정확히 내가 원하는 것일 뿐이다. 그러나, 코드에 어떤 리팩터링을 수행 한 후에도이 동작이 사실인지 확인하는 자동화 된 검사를하고 싶습니다.

현재 가장 좋은 생각은이 코드를 사용하여 일회용 녹 파일을 작성하고 컴파일을 시도하고 특정 오류 메시지를 찾으려고 bash 스크립트를 조작하는 것입니다.

+4

아아, 컴파일 실패에 대한 테스트를 기본적으로 지원하지 않습니다. rustc 자체는 이것을 달성하기위한 기반 구조를 가지고 있지만 ('src/test/compile-fail' 외), 일반적으로 사용 가능하지는 않다. –

+0

@ChrisMorgan : 이런 종류의 테스트를 지원 한 커뮤니티에 관심이 있다고 생각합니까? Rust에는 실제로 많은 진화를 허용하는 진화 된 유형 시스템이 있으며, 실제로 수표가 실제로 적용되는지 확인하는 것이 좋습니다. 과거에는 C++을 사용하여 이런 종류의 작업에 대해 Clang의 구체적인 테스트 ('-verify' 플래그 + Clang의 구체적인 설명)를 사용했습니다. 꽤 발전했습니다. –

+0

@MatthieuM : 라이브러리를 디자인 할 때 특정 코드가 컴파일되지 않는지 확인하는 기능을 원한다는 것을 알고 있습니다. –

답변

1

Rust 프로젝트에는 원하는 작업을 정확하게 수행하는 "컴파일 실패"테스트라는 특수 테스트 세트가 있습니다. 중간화물의 "기능"을 사용하는이됩니다

fn main() { 
    let x: (u64, bool) = (true, 42u64); 
    //~^ ERROR mismatched types 
    //~^^ ERROR mismatched types 
} 

하나의 아이디어 :

compiletest crate 다른 라이브러리가 같은 일을 수행 할 수 있습니다이 아이디어의 추출이다. 분명한 것은 이것이에서 누락

cargo test --features compile_failure 

[features] 

compile_failure = [] 

그리고 테스트를 실행 :

#[test] 
#[cfg(feature = "compile_failure")] 
fn bogus_test() {} 

이 Cargo.toml이 추가 :

기능 플래그와 테스트를 지정 자동 검사는 "올바른 실패"였습니다. 그 밖의 것이 없다면, 내 코드베이스에서 세미 (semi-living) 테스트를 할 수 있습니다.

-2

실패 할 것으로 예상되는 테스트에 주석을 달 수 있습니다.

#[should_fail] 

이와 같이, 실제로 있어야하는 수명에 위배되는 테스트를 작성할 수 있습니다. '경계 밖으로 인덱스'에 대한 테스트의 예를 들어

아래합니다 ( Rust guides에서 가져온) 나는 그것이 추론하기 위하여 서 것이다, 그래서이 예제는 컴파일 오류가있을 것이라고 생각

#[test] 
#[should_fail] 
fn test_out_of_bounds_failure() { 
    let v: &[int] = []; 
    v[0]; 
} 

참조하여 컴파일 평생 위반 오류도 이것에 의해 잡힐 것입니다.

+0

'# [should_fail]'은 컴파일 오류가 아닌 런타임 오류 ("패닉"이라고 함)를위한 것입니다. –

+0

아마 우리는'# [should_fail_compile]'(semi-serious) – thecoshman

관련 문제