]> Repositorios git - scryer-prolog.git/commitdiff
Make "cargo miri test" actually run
authorbakaq <[email protected]>
Tue, 9 Jan 2024 05:37:38 +0000 (02:37 -0300)
committerbakaq <[email protected]>
Tue, 9 Jan 2024 07:38:53 +0000 (04:38 -0300)
17 files changed:
src/arena.rs
src/atom_table.rs
src/heap_iter.rs
src/heap_print.rs
src/machine/arithmetic_ops.rs
src/machine/copier.rs
src/machine/gc.rs
src/machine/lib_machine.rs
src/machine/mock_wam.rs
src/machine/partial_string.rs
src/machine/stack.rs
src/machine/streams.rs
src/parser/char_reader.rs
src/raw_block.rs
tests/scryer/issues.rs
tests/scryer/main.rs
tests/scryer/src_tests.rs

index 40c1b0290156656a7b54d31b1c4084de9a30cd0e..172e6e9d50d0cb3997737c07b996749dcd23301e 100644 (file)
@@ -821,9 +821,9 @@ impl AllocSlab {
     }
 
     fn payload_offset<T>(&self) -> *mut T {
-        let mut ptr = (self as *const AllocSlab) as usize;
-        ptr += mem::size_of::<AllocSlab>();
-        ptr as *mut T
+        // This looks really scary, should this method be marked as unsafe?
+        // Also, this seems to cause UB.
+        unsafe { (self as *const AllocSlab).add(1) as *mut T }
     }
 }
 
@@ -864,6 +864,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn heap_cell_value_const_cast() {
         let mut wam = MockWAM::new();
         #[cfg(target_pointer_width = "32")]
@@ -907,6 +908,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on arena.rs UB")]
     fn heap_put_literal_tests() {
         let mut wam = MockWAM::new();
 
index e62ca927696668d093639eaa5ac9e874a7e068ee..3f60eca69b2c004561bfc606f6fc3f0e837a207f 100644 (file)
@@ -239,6 +239,7 @@ impl Atom {
         } else if let Some(ptr) = self.as_ptr() {
             AtomString::Dynamic(AtomTableRef::map(ptr, |ptr| {
                 let header =
+                    // Miri seems to hit this line a lot
                     unsafe { ptr::read::<AtomHeader>(ptr as *const u8 as *const AtomHeader) };
                 let len = header.len() as usize;
                 let buf = unsafe { (ptr as *const u8).add(mem::size_of::<AtomHeader>()) };
@@ -265,7 +266,7 @@ impl Atom {
 
 unsafe fn write_to_ptr(string: &str, ptr: *mut u8) {
     ptr::write(ptr as *mut _, AtomHeader::build_with(string.len() as u64));
-    let str_ptr = (ptr as usize + mem::size_of::<AtomHeader>()) as *mut u8;
+    let str_ptr = ptr.add(mem::size_of::<AtomHeader>());
     ptr::copy_nonoverlapping(string.as_ptr(), str_ptr, string.len());
 }
 
index 4713aa63159ab3458d258f7b349d63b453606d54..1ff7403ce7bf2356536566ed4ffbcbe68f178340 100644 (file)
@@ -685,6 +685,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "it takes too long to run")]
     fn heap_stackless_iter_tests() {
         let mut wam = MockWAM::new();
 
@@ -1756,6 +1757,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on atom_table.rs UB")]
     fn heap_stackful_iter_tests() {
         let mut wam = MockWAM::new();
 
@@ -2348,6 +2350,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on atom_table.rs UB")]
     fn heap_stackful_post_order_iter() {
         let mut wam = MockWAM::new();
 
@@ -2831,6 +2834,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on atom_table.rs UB")]
     fn heap_stackless_post_order_iter() {
         let mut wam = MockWAM::new();
 
index 599d2e648d370d3465d3343d0ed295d92b5f04f1..515ebef6f4231e9bad08a7e4bc5df8aad4702da8 100644 (file)
@@ -1835,6 +1835,7 @@ mod tests {
     use crate::machine::mock_wam::*;
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn term_printing_tests() {
         let mut wam = MockWAM::new();
 
index 8380c1306d8b3dca5fe4d656ad450b72d29b254c..3de47a604741444f8cffd68634c6a8d6d4946fb7 100644 (file)
@@ -1423,6 +1423,7 @@ mod tests {
     use crate::machine::mock_wam::*;
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn arith_eval_by_metacall_tests() {
         let mut wam = MachineState::new();
         let mut op_dir = default_op_dir();
index c02854ffdcb24212eee874b65720915b8cde5737..b64be4a080451a6ff68d753362d7c91dab398957 100644 (file)
@@ -398,6 +398,7 @@ mod tests {
     use crate::machine::mock_wam::*;
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on atom_table.rs UB")]
     fn copier_tests() {
         let mut wam = MockWAM::new();
 
index 32142e1ddb67bf597ff4c9ec766b8c51f63eaaaf..f62231ea6529f6a53f282d92db11680734792318 100644 (file)
@@ -369,6 +369,7 @@ mod tests {
     use crate::machine::mock_wam::*;
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn heap_marking_tests() {
         let mut wam = MockWAM::new();
 
index 23f8738cd5e4bcbf6a51ae7811916355338c7e91..f644be314a1909eaa7e3b79a22175470d98533b4 100644 (file)
@@ -236,6 +236,7 @@ mod tests {
     use crate::machine::{QueryMatch, QueryResolution, Value};
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn programatic_query() {
         let mut machine = Machine::new_lib();
 
@@ -275,6 +276,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn failing_query() {
         let mut machine = Machine::new_lib();
         let query = String::from(r#"triple("a",P,"b")."#);
@@ -288,6 +290,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore)]
     fn complex_results() {
         let mut machine = Machine::new_lib();
         machine.load_module_string(
@@ -344,6 +347,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn empty_predicate() {
         let mut machine = Machine::new_lib();
         machine.load_module_string(
@@ -359,6 +363,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn list_results() {
         let mut machine = Machine::new_lib();
         machine.load_module_string(
@@ -387,6 +392,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn consult() {
         let mut machine = Machine::new_lib();
 
@@ -445,6 +451,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn integration_test() {
         let mut machine = Machine::new_lib();
 
@@ -486,6 +493,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn findall() {
         let mut machine = Machine::new_lib();
 
index 0da42e08d55ad1542f491fbc2eab858f3aea145c..2679be43b855c1495074bdf52d0946632d7626f1 100644 (file)
@@ -260,6 +260,7 @@ mod tests {
     use super::*;
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn unify_tests() {
         let mut wam = MachineState::new();
         let mut op_dir = default_op_dir();
@@ -481,6 +482,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn test_unify_with_occurs_check() {
         let mut wam = MachineState::new();
         let mut op_dir = default_op_dir();
index cfbd4d8b6c86bcd267d959797e0b52384cc575cc..ebde82b7de280798b2d3f0ff58a6ac199802ce38 100644 (file)
@@ -785,6 +785,7 @@ mod test {
     use crate::machine::mock_wam::*;
 
     #[test]
+    #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
     fn pstr_iter_tests() {
         let mut wam = MockWAM::new();
 
index fd465c140710203f163a1b2acf2b66c43c8d2adb..12aba4569e1564e8bf17355133a6e808d17549a7 100644 (file)
@@ -189,7 +189,7 @@ impl Stack {
 
             for idx in 0..num_cells {
                 ptr::write(
-                    (new_ptr as usize + offset) as *mut HeapCellValue,
+                    new_ptr.add(offset) as *mut HeapCellValue,
                     stack_loc_as_cell!(AndFrame, e, idx + 1),
                 );
 
@@ -242,7 +242,8 @@ impl Stack {
     #[inline(always)]
     pub(crate) fn index_and_frame_mut(&mut self, e: usize) -> &mut AndFrame {
         unsafe {
-            let ptr = self.buf.base as usize + e;
+            // This is doing alignment wrong
+            let ptr = self.buf.base.add(e);
             &mut *(ptr as *mut AndFrame)
         }
     }
@@ -280,6 +281,7 @@ mod tests {
     use crate::machine::mock_wam::*;
 
     #[test]
+    #[cfg_attr(miri, ignore)]
     fn stack_tests() {
         let mut wam = MockWAM::new();
 
index fc957adebeb841dfffb8d54f1efbfc533b2b1f89..53269bf49a62817ac884cc0713a43dee3aa680db 100644 (file)
@@ -469,6 +469,7 @@ macro_rules! arena_allocated_impl_for_stream {
             #[inline]
             fn copy_to_arena(self, dst: *mut Self) -> Self::PtrToAllocated {
                 unsafe {
+                    // Miri seems to hit this a lot
                     ptr::write(dst, self);
                     TypedArenaPtr::new(dst as *mut Self)
                 }
index 8553905df75244b7aca7fcfef61427a1a2d07f65..75e3fef832a2ba954c30a8a948502a2e1fe0b692 100644 (file)
@@ -377,6 +377,7 @@ mod tests {
     use std::io::Cursor;
 
     #[test]
+    #[cfg_attr(miri, ignore = "slow and not very relevant")]
     fn plain_string() {
         let mut read_string = CharReader::new(Cursor::new("a string"));
 
@@ -389,6 +390,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "slow and not very relevant")]
     fn greek_string() {
         let mut read_string = CharReader::new(Cursor::new("λέξη"));
 
@@ -401,6 +403,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "slow and not very relevant")]
     fn russian_string() {
         let mut read_string = CharReader::new(Cursor::new("слово"));
 
@@ -413,6 +416,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "slow and not very relevant")]
     fn greek_lorem_ipsum() {
         let lorem_ipsum = "Λορεμ ιπσθμ δολορ σιτ αμετ, οφφενδιτ
     εφφιcιενδι σιτ ει, ηαρθμ λεγερε qθαερενδθμ ιθσ νε. Ηασ νο εροσ
@@ -484,6 +488,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "slow and not very relevant")]
     fn armenian_lorem_ipsum() {
         let lorem_ipsum = "լոռեմ իպսում դոլոռ սիթ ամեթ, նովում գռաեծո
         սեա եա, աբհոռռեանթ դիսպութանդո եի քուի. իդ քուոդ ինդոծթում
@@ -557,6 +562,7 @@ mod tests {
     }
 
     #[test]
+    #[cfg_attr(miri, ignore = "slow and not very relevant")]
     fn russian_lorem_ipsum() {
         let lorem_ipsum = "Лорем ипсум долор сит амет, атяуи дицам еи
         сит, ид сеа фацилис елаборарет. Меа еу яуас алияуид, те яуи
index 41be0706d99200449704f4580b300aafaf8e39c3..2c10f49426c6203afca3538910ccd165e6013095 100644 (file)
@@ -43,7 +43,7 @@ impl<T: RawBlockTraits> RawBlock<T> {
         let layout = alloc::Layout::from_size_align_unchecked(cap, T::align());
 
         self.base = alloc::alloc(layout) as *const _;
-        self.top = (self.base as usize + cap) as *const _;
+        self.top = self.base.add(cap);
         *self.ptr.get_mut() = self.base as *mut _;
     }
 
@@ -98,7 +98,7 @@ impl<T: RawBlockTraits> RawBlock<T> {
     pub unsafe fn alloc(&self, size: usize) -> *mut u8 {
         if self.free_space() >= size {
             let ptr = *self.ptr.get();
-            *self.ptr.get() = (ptr as usize + size) as *mut _;
+            *self.ptr.get() = ptr.add(size) as *mut _;
             ptr
         } else {
             ptr::null_mut()
index f4fd68e0c09fff274eb4ddbe1aae37fc1c4a8812..39e303780241cc0fea28cc2368e1bedbc145a9bd 100644 (file)
@@ -4,6 +4,7 @@ use serial_test::serial;
 // issue #831
 #[serial]
 #[test]
+#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
 fn call_0() {
     load_module_test(
         "tests-pl/issue831-call0.pl",
index 643f8d7160236548002dd2837b47ff3c32597ef6..d1e826f0f5a310dabcba93024fb9d9bf5d2b9dc3 100644 (file)
@@ -13,6 +13,7 @@ mod src_tests;
 /// to re-generate all reference output files run `TRYCMD=overwrite cargo test -- cli_test`
 /// then check that the changes are as expected e.g. by looking at the `git diff`
 #[test]
+#[cfg_attr(miri, ignore = "blocked on crossbeam UB")]
 fn cli_tests() {
     trycmd::TestCases::new()
         .default_bin_name("scryer-prolog")
index 99272686660f7fa588518ce504084a1a8c70a492..a3d6ddbf5214fed8f3fe2baae62b7ab37cd707fa 100644 (file)
@@ -3,30 +3,35 @@ use serial_test::serial;
 
 #[serial]
 #[test]
+#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
 fn builtins() {
     load_module_test("src/tests/builtins.pl", "");
 }
 
 #[serial]
 #[test]
+#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
 fn call_with_inference_limit() {
     load_module_test("src/tests/call_with_inference_limit.pl", "");
 }
 
 #[serial]
 #[test]
+#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
 fn facts() {
     load_module_test("src/tests/facts.pl", "");
 }
 
 #[serial]
 #[test]
+#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
 fn hello_world() {
     load_module_test("src/tests/hello_world.pl", "Hello World!\n");
 }
 
 #[serial]
 #[test]
+#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
 fn syntax_error() {
     load_module_test(
         "tests-pl/syntax_error.pl",
@@ -36,18 +41,21 @@ fn syntax_error() {
 
 #[serial]
 #[test]
+#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
 fn predicates() {
     load_module_test("src/tests/predicates.pl", "");
 }
 
 #[serial]
 #[test]
+#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
 fn rules() {
     load_module_test("src/tests/rules.pl", "");
 }
 
 #[serial]
 #[test]
+#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
 fn setup_call_cleanup_load() {
     load_module_test(
         "src/tests/setup_call_cleanup.pl",
@@ -57,12 +65,14 @@ fn setup_call_cleanup_load() {
 
 #[serial]
 #[test]
+#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
 fn clpz_load() {
     load_module_test("src/tests/clpz/test_clpz.pl", "");
 }
 
 #[serial]
 #[test]
+#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
 fn iso_conformity_tests() {
     load_module_test("tests-pl/iso-conformity-tests.pl", "All tests passed");
 }