Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ICE in constprop due to out of bounds access in a zero sized array #69312

Closed
gwafotapa opened this issue Feb 20, 2020 · 10 comments · Fixed by #69339
Closed

ICE in constprop due to out of bounds access in a zero sized array #69312

gwafotapa opened this issue Feb 20, 2020 · 10 comments · Fixed by #69339
Labels
A-const-eval Area: Constant evaluation, covers all const contexts (static, const fn, ...) A-MIR Area: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@gwafotapa
Copy link

gwafotapa commented Feb 20, 2020

Here's the crashing code I came down to:

  • An empty main.rs
  • lib.rs contains a single line: "pub mod matrix.rs"
  • a file matrix.rs with the following code:
pub struct Bug {
    field: usize,
}

impl Bug {
    pub fn test(&self) {
        let cols = [self.field; 0];
        cols[self.field];
    }
}

This happened as I permuted type and size in my array definition. My intention was not to declare a zero sized array but to declare an array filled with zeros. Anyway, the compiler crashed. I noticed that if I remove the pub from the line in lib.rs, it compiles fine.

Meta

rustc --verbose --version:

rustc 1.41.0 (5e1a79984 2020-01-27)
binary: rustc
commit-hash: 5e1a799842ba6ed4a57e91f7ab9435947482f7d8
commit-date: 2020-01-27
host: x86_64-unknown-linux-gnu
release: 1.41.0
LLVM version: 9.0

Backtrace:

   Compiling bug v0.1.0 (/home/guillaume/projects/bug)
thread 'rustc' panicked at 'assertion failed: `(left == right)`
  left: `8`,
 right: `0`', src/librustc/mir/interpret/value.rs:319:9
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/libunwind.rs:88
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at src/libstd/sys_common/backtrace.rs:84
   3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
             at src/libstd/sys_common/backtrace.rs:61
   4: core::fmt::write
             at src/libcore/fmt/mod.rs:1025
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1426
   6: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:65
   7: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:50
   8: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:193
   9: std::panicking::default_hook
             at src/libstd/panicking.rs:210
  10: rustc_driver::report_ice
  11: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:475
  12: rust_begin_unwind
             at src/libstd/panicking.rs:375
  13: std::panicking::begin_panic_fmt
             at src/libstd/panicking.rs:326
  14: rustc_mir::interpret::visitor::ValueVisitor::walk_value
  15: rustc_mir::interpret::validity::<impl rustc_mir::interpret::eval_context::InterpCx<M>>::validate_operand
  16: <rustc_mir::transform::const_prop::ConstPropagator as rustc::mir::visit::MutVisitor>::visit_statement
  17: <rustc_mir::transform::const_prop::ConstProp as rustc_mir::transform::MirPass>::run_pass
  18: rustc_mir::transform::run_passes
  19: rustc_mir::transform::run_optimization_passes
  20: rustc_mir::transform::optimized_mir
  21: rustc::ty::query::<impl rustc::ty::query::config::QueryAccessors for rustc::ty::query::queries::optimized_mir>::compute
  22: rustc::dep_graph::graph::DepGraph::with_task_impl
  23: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query
  24: rustc::ty::<impl rustc::ty::context::TyCtxt>::instance_mir
  25: rustc_mir::monomorphize::collector::collect_items_rec
  26: rustc_mir::monomorphize::collector::collect_crate_mono_items::{{closure}}
  27: rustc::util::common::time
  28: rustc_mir::monomorphize::collector::collect_crate_mono_items
  29: rustc::util::common::time
  30: rustc_mir::monomorphize::partitioning::collect_and_partition_mono_items
  31: rustc::ty::query::__query_compute::collect_and_partition_mono_items
  32: rustc::dep_graph::graph::DepGraph::with_task_impl
  33: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query
  34: rustc_codegen_ssa::back::symbol_export::exported_symbols_provider_local
  35: rustc::ty::query::__query_compute::exported_symbols
  36: rustc::dep_graph::graph::DepGraph::with_task_impl
  37: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query
  38: rustc_metadata::rmeta::encoder::EncodeContext::encode_crate_root
  39: rustc::ty::context::tls::with_context::{{closure}}
  40: rustc_metadata::rmeta::encoder::encode_metadata
  41: rustc_metadata::rmeta::decoder::cstore_impl::<impl rustc::middle::cstore::CrateStore for rustc_metadata::creader::CStore>::encode_metadata
  42: rustc::ty::context::TyCtxt::encode_metadata
  43: rustc_interface::passes::start_codegen::{{closure}}
  44: rustc_interface::passes::start_codegen
  45: rustc::ty::context::tls::enter_global
  46: rustc_interface::queries::Queries::ongoing_codegen
  47: rustc_interface::interface::run_compiler_in_existing_thread_pool
  48: std::thread::local::LocalKey<T>::with
  49: scoped_tls::ScopedKey<T>::set
  50: syntax::with_globals
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

error: internal compiler error: unexpected panic

note: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports

note: rustc 1.41.0 (5e1a79984 2020-01-27) running on x86_64-unknown-linux-gnu

note: compiler flags: -C debuginfo=2 -C incremental --crate-type lib

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
#0 [optimized_mir] processing `matrix::Bug::test`
#1 [collect_and_partition_mono_items] collect_and_partition_mono_items
#2 [exported_symbols] exported_symbols
end of query stack
error: could not compile `bug`.
@Centril Centril added A-const-eval Area: Constant evaluation, covers all const contexts (static, const fn, ...) A-MIR Area: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ labels Feb 20, 2020
@Centril Centril changed the title Compiler crash following out of bounds access in a zero sized array ICE in constprop to out of bounds access in a zero sized array Feb 20, 2020
@Centril
Copy link
Contributor

Centril commented Feb 20, 2020

cc @wesleywiser @oli-obk

@oli-obk
Copy link
Contributor

oli-obk commented Feb 20, 2020

cc @RalfJung did the value visitor changes get merged?

@RalfJung
Copy link
Member

@oli-obk #69257 is still waiting for review if that's the one you mean.

@RalfJung
Copy link
Member

RalfJung commented Feb 20, 2020

The ICE seems to be gone on nightly, though. So likely just needs a test (or checking that we already have an appropriate test)?

@Centril Centril changed the title ICE in constprop to out of bounds access in a zero sized array ICE in constprop due to out of bounds access in a zero sized array Feb 20, 2020
@Centril Centril added the E-needs-test Call for participation: An issue has been fixed and does not reproduce, but no test has been added. label Feb 20, 2020
@Centril
Copy link
Contributor

Centril commented Feb 20, 2020

@RalfJung Maybe we should also find the PR that fixed this and beta nominate?

@wesleywiser
Copy link
Member

cargo bisect-rustc points to #67501 as being responsible for fixing this.

@oli-obk
Copy link
Contributor

oli-obk commented Feb 22, 2020

That PR is too big to backport. I suggest to just remove the assertion on beta as the ICE is properly fixed on master

bors added a commit that referenced this issue Feb 22, 2020
Rollup of 7 pull requests

Successful merges:

 - #68984 (Make `u8::is_ascii` a stable `const fn`)
 - #69339 (Add test for #69312)
 - #69346 (Clean up E0323, E0324, E0325 and E0326 explanations)
 - #69348 (Wrong error message for move_ref_pattern)
 - #69349 (MIR is not an experiment anymore)
 - #69354 (Test `Duration::new` panics on overflow)
 - #69370 (move const_eval.rs into the module folder)

Failed merges:

r? @ghost
@bors bors closed this as completed in ec980a2 Feb 22, 2020
@oli-obk
Copy link
Contributor

oli-obk commented Feb 23, 2020

Still need to backport

@oli-obk oli-obk reopened this Feb 23, 2020
@JohnTitor JohnTitor added C-bug Category: This is a bug. and removed E-needs-test Call for participation: An issue has been fixed and does not reproduce, but no test has been added. labels Mar 1, 2020
@JohnTitor
Copy link
Member

The fix is already on beta so backport is unneeded?

@RalfJung
Copy link
Member

RalfJung commented Mar 1, 2020

Yeah, playground confirms that this ICEs on stable but works fine on beta and nightly.

@RalfJung RalfJung closed this as completed Mar 1, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-const-eval Area: Constant evaluation, covers all const contexts (static, const fn, ...) A-MIR Area: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants