2014-10-30 54 views
5

我正在寫一些處理原始指針的Rust代碼。這些原始指針然後通過使用ContravariantLifetime將結構的生命週期與我的對象綁定的結構暴露給用戶。我可以編寫無效生命期測試嗎?

我希望能夠編寫測試來驗證面向用戶的結構不能比我的對象壽命更長。我有如下代碼:

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

這不能編譯,這正是我想要的。不過,我希望有一些自動檢查,即使在對代碼進行任何重構之後,此行爲都是真實的。

我現在最好的想法是用此代碼編寫一次性的Rust文件,並配置bash腳本以嘗試編譯它們並查找特定的錯誤消息,這些都感覺很詭異。

+4

唉,對失敗編譯的測試本身並不支持。 rustc本身具有實現這種功能的基礎設施('src/test/compile-fail'等),但是它是自定義的並且通常不可用。 – 2014-10-30 23:17:16

+0

@ChrisMorgan:你認爲社區會支持這種測試嗎? Rust有一個真正發展的類型系統,可以執行大量的檢查,驗證檢查是否實際執行似乎很好。過去,在C++中,我使用了Clang的特定測試('-verify' flag + Clang的具體評論)來處理這類事情;這是相當先進的。 – 2014-10-31 08:48:18

+0

@MatthieuM .:我知道在設計一個庫時,有能力測試驗證某些代碼無法編譯。 – 2014-10-31 12:08:53

回答

1

Rust項目有一組特殊的稱爲「編譯 - 失敗」測試的測試,它們完全符合您的需求。

compiletest crate是這種想法,允許其他圖書館做同樣的事情的提取:那被中途有使用貨運的「功能」

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

一個想法。

指定與功能標誌測試:

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

一下添加到Cargo.toml:

[features] 

compile_failure = [] 

和運行測試,

cargo test --features compile_failure 

最明顯的事情,從這個失蹤自動檢查「是否正確的失敗」。如果沒有其他的東西,這允許我在我的代碼庫中進行半測試。

-2

您可以註釋一個您預計會失敗的測試。

#[should_fail] 

因此,您可以編寫一個測試,試圖破壞它應該有的生活時間,從而失敗,這實際上是一次通過。

爲「索引越界」測試的例子見下文(從Rust guides拉)

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

我相信,這個例子是一個編譯錯誤,所以它會站在原因,你的編譯生命週期違規錯誤也會被這個問題所困擾。

+0

'#[should_fail]'用於運行時失敗(現在稱爲「恐慌」),而不是編譯錯誤。 – 2014-11-11 00:01:44

+0

也許我們需要推一個'#[should_fail_compile]'(半認真的) – thecoshman 2014-11-11 08:34:13

相關問題