From f6c4fcf12850602588d3c2dacffbf4b01308cb04 Mon Sep 17 00:00:00 2001 From: Matthew Piziak Date: Fri, 9 Sep 2016 12:21:01 -0400 Subject: [PATCH 1/9] fix silent overflows on `Step` impls r? @eddyb --- src/libcore/iter/range.rs | 6 ++++++ src/libcoretest/iter.rs | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/libcore/iter/range.rs b/src/libcore/iter/range.rs index 66d05d81d80cd..a9487b7f46db6 100644 --- a/src/libcore/iter/range.rs +++ b/src/libcore/iter/range.rs @@ -95,11 +95,13 @@ macro_rules! step_impl_unsigned { } #[inline] + #[rustc_inherit_overflow_checks] fn add_one(&self) -> Self { *self + 1 } #[inline] + #[rustc_inherit_overflow_checks] fn sub_one(&self) -> Self { *self - 1 } @@ -166,11 +168,13 @@ macro_rules! step_impl_signed { } #[inline] + #[rustc_inherit_overflow_checks] fn add_one(&self) -> Self { *self + 1 } #[inline] + #[rustc_inherit_overflow_checks] fn sub_one(&self) -> Self { *self - 1 } @@ -215,11 +219,13 @@ macro_rules! step_impl_no_between { } #[inline] + #[rustc_inherit_overflow_checks] fn add_one(&self) -> Self { *self + 1 } #[inline] + #[rustc_inherit_overflow_checks] fn sub_one(&self) -> Self { *self - 1 } diff --git a/src/libcoretest/iter.rs b/src/libcoretest/iter.rs index 27eb25537f31b..7671ef2e8b982 100644 --- a/src/libcoretest/iter.rs +++ b/src/libcoretest/iter.rs @@ -915,6 +915,20 @@ fn test_range_step() { assert_eq!((isize::MIN..isize::MAX).step_by(1).size_hint(), (usize::MAX, Some(usize::MAX))); } +#[test] +#[should_panic] +fn test_range_overflow_unsigned() { + let mut it = u8::MAX..; + it.next(); +} + +#[test] +#[should_panic] +fn test_range_overflow_signed() { + let mut it = i8::MAX..; + it.next(); +} + #[test] fn test_repeat() { let mut it = repeat(42); From 19fd7fcce90fe41edd4a25f1f9d3cd90d7e285bb Mon Sep 17 00:00:00 2001 From: Matthew Piziak Date: Mon, 12 Sep 2016 11:23:02 -0400 Subject: [PATCH 2/9] add run-fail tests --- src/test/run-fail/iter-step-overflow-debug.rs | 27 +++++++++++++++++++ .../run-fail/iter-step-overflow-ndebug.rs | 19 +++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/test/run-fail/iter-step-overflow-debug.rs create mode 100644 src/test/run-fail/iter-step-overflow-ndebug.rs diff --git a/src/test/run-fail/iter-step-overflow-debug.rs b/src/test/run-fail/iter-step-overflow-debug.rs new file mode 100644 index 0000000000000..fad03adfdab2a --- /dev/null +++ b/src/test/run-fail/iter-step-overflow-debug.rs @@ -0,0 +1,27 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-flags: -C debug_assertions=yes + +use std::panic; + +fn main() { + let r = panic::catch_unwind(|| { + let mut it = u8::MAX..; + it.next(); + }); + assert!(r.is_err()); + + let r = panic::catch_unwind(|| { + let mut it = i8::MAX..; + it.next(); + }); + assert!(r.is_err()); +} diff --git a/src/test/run-fail/iter-step-overflow-ndebug.rs b/src/test/run-fail/iter-step-overflow-ndebug.rs new file mode 100644 index 0000000000000..718c3e3c533bd --- /dev/null +++ b/src/test/run-fail/iter-step-overflow-ndebug.rs @@ -0,0 +1,19 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-flags: -C debug_assertions=no + +fn main() { + let mut it = u8::MAX..; + assert_eq!(it.next(), u8::MIN); + + let mut it = i8::MAX..; + assert_eq!(it.next(), i8::MIN); +} From 065bf4ba06dd7fc9bab64a49ab92126636b926a3 Mon Sep 17 00:00:00 2001 From: Matthew Piziak Date: Tue, 13 Sep 2016 11:12:23 -0400 Subject: [PATCH 3/9] remove non-run-fail tests --- src/libcoretest/iter.rs | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/libcoretest/iter.rs b/src/libcoretest/iter.rs index 7671ef2e8b982..27eb25537f31b 100644 --- a/src/libcoretest/iter.rs +++ b/src/libcoretest/iter.rs @@ -915,20 +915,6 @@ fn test_range_step() { assert_eq!((isize::MIN..isize::MAX).step_by(1).size_hint(), (usize::MAX, Some(usize::MAX))); } -#[test] -#[should_panic] -fn test_range_overflow_unsigned() { - let mut it = u8::MAX..; - it.next(); -} - -#[test] -#[should_panic] -fn test_range_overflow_signed() { - let mut it = i8::MAX..; - it.next(); -} - #[test] fn test_repeat() { let mut it = repeat(42); From dc607deac7293e9fa767248fa2613f65a8c6a849 Mon Sep 17 00:00:00 2001 From: Matthew Piziak Date: Sun, 9 Oct 2016 06:35:07 -0400 Subject: [PATCH 4/9] use UFCS with Add::add and Sub::sub instead of unstable attributes --- src/libcore/iter/range.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/libcore/iter/range.rs b/src/libcore/iter/range.rs index a9487b7f46db6..6cfec06b0baab 100644 --- a/src/libcore/iter/range.rs +++ b/src/libcore/iter/range.rs @@ -95,15 +95,13 @@ macro_rules! step_impl_unsigned { } #[inline] - #[rustc_inherit_overflow_checks] fn add_one(&self) -> Self { - *self + 1 + Add::add(*self, 1); } #[inline] - #[rustc_inherit_overflow_checks] fn sub_one(&self) -> Self { - *self - 1 + Sub::sub(*self, 1); } #[inline] @@ -168,15 +166,13 @@ macro_rules! step_impl_signed { } #[inline] - #[rustc_inherit_overflow_checks] fn add_one(&self) -> Self { - *self + 1 + Add::add(*self, 1); } #[inline] - #[rustc_inherit_overflow_checks] fn sub_one(&self) -> Self { - *self - 1 + Sub::sub(*self, 1); } #[inline] @@ -219,15 +215,13 @@ macro_rules! step_impl_no_between { } #[inline] - #[rustc_inherit_overflow_checks] fn add_one(&self) -> Self { - *self + 1 + Add::add(*self, 1); } #[inline] - #[rustc_inherit_overflow_checks] fn sub_one(&self) -> Self { - *self - 1 + Sub::sub(*self, 1); } #[inline] From dba66788bd4f4755bbc8ffb6b17e075499efa7b7 Mon Sep 17 00:00:00 2001 From: Matthew Piziak Date: Tue, 11 Oct 2016 15:58:27 -0400 Subject: [PATCH 5/9] replace MIN/MAX constants with min_value/max_value functions MIN and MAX were breaking the build for me. min_value and max_value do not. --- src/test/run-fail/iter-step-overflow-debug.rs | 4 ++-- src/test/run-fail/iter-step-overflow-ndebug.rs | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/run-fail/iter-step-overflow-debug.rs b/src/test/run-fail/iter-step-overflow-debug.rs index fad03adfdab2a..92ac5316609f1 100644 --- a/src/test/run-fail/iter-step-overflow-debug.rs +++ b/src/test/run-fail/iter-step-overflow-debug.rs @@ -14,13 +14,13 @@ use std::panic; fn main() { let r = panic::catch_unwind(|| { - let mut it = u8::MAX..; + let mut it = u8::max_value()..; it.next(); }); assert!(r.is_err()); let r = panic::catch_unwind(|| { - let mut it = i8::MAX..; + let mut it = i8::max_value()..; it.next(); }); assert!(r.is_err()); diff --git a/src/test/run-fail/iter-step-overflow-ndebug.rs b/src/test/run-fail/iter-step-overflow-ndebug.rs index 718c3e3c533bd..35ec97b22993c 100644 --- a/src/test/run-fail/iter-step-overflow-ndebug.rs +++ b/src/test/run-fail/iter-step-overflow-ndebug.rs @@ -11,9 +11,9 @@ // compile-flags: -C debug_assertions=no fn main() { - let mut it = u8::MAX..; - assert_eq!(it.next(), u8::MIN); + let mut it = u8::max_value()..; + assert_eq!(it.next(), u8::min_value()); - let mut it = i8::MAX..; - assert_eq!(it.next(), i8::MIN); + let mut it = i8::max_value()..; + assert_eq!(it.next(), i8::min_value()); } From db1e85d0923970e0d30e81bbbd1c0d8142ff282a Mon Sep 17 00:00:00 2001 From: Matthew Piziak Date: Tue, 11 Oct 2016 20:17:52 -0400 Subject: [PATCH 6/9] remove erroneous semicolons --- src/libcore/iter/range.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libcore/iter/range.rs b/src/libcore/iter/range.rs index 6cfec06b0baab..f1697ea448ae4 100644 --- a/src/libcore/iter/range.rs +++ b/src/libcore/iter/range.rs @@ -96,12 +96,12 @@ macro_rules! step_impl_unsigned { #[inline] fn add_one(&self) -> Self { - Add::add(*self, 1); + Add::add(*self, 1) } #[inline] fn sub_one(&self) -> Self { - Sub::sub(*self, 1); + Sub::sub(*self, 1) } #[inline] @@ -167,12 +167,12 @@ macro_rules! step_impl_signed { #[inline] fn add_one(&self) -> Self { - Add::add(*self, 1); + Add::add(*self, 1) } #[inline] fn sub_one(&self) -> Self { - Sub::sub(*self, 1); + Sub::sub(*self, 1) } #[inline] @@ -216,12 +216,12 @@ macro_rules! step_impl_no_between { #[inline] fn add_one(&self) -> Self { - Add::add(*self, 1); + Add::add(*self, 1) } #[inline] fn sub_one(&self) -> Self { - Sub::sub(*self, 1); + Sub::sub(*self, 1) } #[inline] From cb26d5503ec5ccceeedd6861dd406f174a9af93e Mon Sep 17 00:00:00 2001 From: Matthew Piziak Date: Sat, 22 Oct 2016 16:27:31 -0400 Subject: [PATCH 7/9] unpwrap iterators in tests --- src/test/run-fail/iter-step-overflow-debug.rs | 4 ++-- src/test/run-fail/iter-step-overflow-ndebug.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/run-fail/iter-step-overflow-debug.rs b/src/test/run-fail/iter-step-overflow-debug.rs index 92ac5316609f1..85f7186508f9f 100644 --- a/src/test/run-fail/iter-step-overflow-debug.rs +++ b/src/test/run-fail/iter-step-overflow-debug.rs @@ -15,13 +15,13 @@ use std::panic; fn main() { let r = panic::catch_unwind(|| { let mut it = u8::max_value()..; - it.next(); + it.next().unwrap(); }); assert!(r.is_err()); let r = panic::catch_unwind(|| { let mut it = i8::max_value()..; - it.next(); + it.next().unwrap(); }); assert!(r.is_err()); } diff --git a/src/test/run-fail/iter-step-overflow-ndebug.rs b/src/test/run-fail/iter-step-overflow-ndebug.rs index 35ec97b22993c..5c45949b8c90a 100644 --- a/src/test/run-fail/iter-step-overflow-ndebug.rs +++ b/src/test/run-fail/iter-step-overflow-ndebug.rs @@ -12,8 +12,8 @@ fn main() { let mut it = u8::max_value()..; - assert_eq!(it.next(), u8::min_value()); + assert_eq!(it.next().unwrap(), u8::min_value()); let mut it = i8::max_value()..; - assert_eq!(it.next(), i8::min_value()); + assert_eq!(it.next().unwrap(), i8::min_value()); } From dd6e8c5f186a31ca6b714c37fd7690a83517080b Mon Sep 17 00:00:00 2001 From: Matthew Piziak Date: Sun, 30 Oct 2016 12:04:57 -0400 Subject: [PATCH 8/9] move overflow tests from rust-fail to run-pass --- src/test/{run-fail => run-pass}/iter-step-overflow-debug.rs | 0 src/test/{run-fail => run-pass}/iter-step-overflow-ndebug.rs | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/test/{run-fail => run-pass}/iter-step-overflow-debug.rs (100%) rename src/test/{run-fail => run-pass}/iter-step-overflow-ndebug.rs (100%) diff --git a/src/test/run-fail/iter-step-overflow-debug.rs b/src/test/run-pass/iter-step-overflow-debug.rs similarity index 100% rename from src/test/run-fail/iter-step-overflow-debug.rs rename to src/test/run-pass/iter-step-overflow-debug.rs diff --git a/src/test/run-fail/iter-step-overflow-ndebug.rs b/src/test/run-pass/iter-step-overflow-ndebug.rs similarity index 100% rename from src/test/run-fail/iter-step-overflow-ndebug.rs rename to src/test/run-pass/iter-step-overflow-ndebug.rs From 8f19d5c3f6e9e6b37a63175875eae6c11c56822e Mon Sep 17 00:00:00 2001 From: Matthew Piziak Date: Wed, 2 Nov 2016 10:11:53 -0400 Subject: [PATCH 9/9] add max value from iterator --- src/test/run-pass/iter-step-overflow-debug.rs | 2 ++ src/test/run-pass/iter-step-overflow-ndebug.rs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/test/run-pass/iter-step-overflow-debug.rs b/src/test/run-pass/iter-step-overflow-debug.rs index 85f7186508f9f..5b9b58f028894 100644 --- a/src/test/run-pass/iter-step-overflow-debug.rs +++ b/src/test/run-pass/iter-step-overflow-debug.rs @@ -15,12 +15,14 @@ use std::panic; fn main() { let r = panic::catch_unwind(|| { let mut it = u8::max_value()..; + it.next().unwrap(); // 255 it.next().unwrap(); }); assert!(r.is_err()); let r = panic::catch_unwind(|| { let mut it = i8::max_value()..; + it.next().unwrap(); // 127 it.next().unwrap(); }); assert!(r.is_err()); diff --git a/src/test/run-pass/iter-step-overflow-ndebug.rs b/src/test/run-pass/iter-step-overflow-ndebug.rs index 5c45949b8c90a..8642f1643c11c 100644 --- a/src/test/run-pass/iter-step-overflow-ndebug.rs +++ b/src/test/run-pass/iter-step-overflow-ndebug.rs @@ -12,8 +12,10 @@ fn main() { let mut it = u8::max_value()..; + assert_eq!(it.next().unwrap(), 255); assert_eq!(it.next().unwrap(), u8::min_value()); let mut it = i8::max_value()..; + assert_eq!(it.next().unwrap(), 127); assert_eq!(it.next().unwrap(), i8::min_value()); }