Skip to content

Overflow in span subtraction / astencode #23115

Closed
@Manishearth

Description

@Manishearth

https://travis-ci.org/GuillaumeGomez/rust-GSL/builds/53335854


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: run with `RUST_BACKTRACE=1` for a backtrace
thread 'rustc' panicked at 'arithmetic operation overflowed', /home/rustbuild/src/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libsyntax/codemap.rs:73

stack backtrace:
   1:     0x7fd52b3bcf6f - sys::backtrace::write::h2f046b875b210aadOBA
   2:     0x7fd52b3e7c82 - panicking::on_panic::h792ac47fb8c07faehHJ
   3:     0x7fd52b31cf2a - rt::unwind::begin_unwind_inner::hbffac672008352c8knJ
   4:     0x7fd52b31d641 - rt::unwind::begin_unwind_fmt::hbe64affaa986f482VlJ
   5:     0x7fd52b3e7807 - rust_begin_unwind
   6:     0x7fd52b433114 - panicking::panic_fmt::h81cd96819f02da8dIZs
   7:     0x7fd52b42f53d - panicking::panic::h8ea414638b29b322UXs
   8:     0x7fd5286f98ac - codemap::BytePos.Sub::sub::h13c0a0f10f07c348YWB
   9:     0x7fd529035ec0 - middle::astencode::DecodeContext<'a, 'b, 'tcx>::tr_span::hdd7910e968f71d01FCa
  10:     0x7fd52904679c - fold::noop_fold_expr::h1258022642513463166
  11:     0x7fd5290464a3 - ptr::P<T>::map::h4462110055941524197
  12:     0x7fd529049c9e - fold::noop_fold_expr::closure.66610
  13:     0x7fd5290469e1 - fold::noop_fold_expr::h1258022642513463166
  14:     0x7fd5290464a3 - ptr::P<T>::map::h4462110055941524197
  15:     0x7fd529049c9e - fold::noop_fold_expr::closure.66610
  16:     0x7fd529046bbe - fold::noop_fold_expr::h1258022642513463166
  17:     0x7fd5290464a3 - ptr::P<T>::map::h4462110055941524197
  18:     0x7fd529049c4b - fold::noop_fold_expr::closure.66605
  19:     0x7fd52904e0a4 - fold::noop_fold_local::closure.66836
  20:     0x7fd52904da97 - fold::noop_fold_decl::closure.66833
  21:     0x7fd52904bc9b - fold::Folder::fold_stmt::closure.66763
  22:     0x7fd52904b553 - fold::noop_fold_block::closure.66714
  23:     0x7fd52904b208 - iter::FlatMap<I, U, F>.Iterator::next::h9223681505759829108
  24:     0x7fd52904a9cf - vec::Vec<T>.FromIterator<T>::from_iter::h13016817088923062838
  25:     0x7fd52904a295 - fold::noop_fold_block::closure.66623
  26:     0x7fd529049e32 - fold::noop_fold_block::h14827012078068820658
  27:     0x7fd529047873 - fold::noop_fold_expr::h1258022642513463166
  28:     0x7fd5290464a3 - ptr::P<T>::map::h4462110055941524197
  29:     0x7fd529049c4b - fold::noop_fold_expr::closure.66605
  30:     0x7fd52904a327 - fold::noop_fold_block::closure.66623
  31:     0x7fd529049e32 - fold::noop_fold_block::h14827012078068820658
  32:     0x7fd529047873 - fold::noop_fold_expr::h1258022642513463166
  33:     0x7fd5290464a3 - ptr::P<T>::map::h4462110055941524197
  34:     0x7fd52904c176 - fold::Folder::fold_stmt::closure.66763
  35:     0x7fd52904b553 - fold::noop_fold_block::closure.66714
  36:     0x7fd52904b208 - iter::FlatMap<I, U, F>.Iterator::next::h9223681505759829108
  37:     0x7fd52904a9cf - vec::Vec<T>.FromIterator<T>::from_iter::h13016817088923062838
  38:     0x7fd52904a295 - fold::noop_fold_block::closure.66623
  39:     0x7fd529049e32 - fold::noop_fold_block::h14827012078068820658
  40:     0x7fd529046f87 - fold::noop_fold_expr::h1258022642513463166
  41:     0x7fd5290464a3 - ptr::P<T>::map::h4462110055941524197
  42:     0x7fd52904bb9b - fold::Folder::fold_stmt::closure.66763
  43:     0x7fd52904b553 - fold::noop_fold_block::closure.66714
  44:     0x7fd52904b208 - iter::FlatMap<I, U, F>.Iterator::next::h9223681505759829108
  45:     0x7fd52904a9cf - vec::Vec<T>.FromIterator<T>::from_iter::h13016817088923062838
  46:     0x7fd52904a295 - fold::noop_fold_block::closure.66623
  47:     0x7fd529049e32 - fold::noop_fold_block::h14827012078068820658
  48:     0x7fd529047873 - fold::noop_fold_expr::h1258022642513463166
  49:     0x7fd5290464a3 - ptr::P<T>::map::h4462110055941524197
  50:     0x7fd529049c4b - fold::noop_fold_expr::closure.66605
  51:     0x7fd52904a327 - fold::noop_fold_block::closure.66623
  52:     0x7fd529049e32 - fold::noop_fold_block::h14827012078068820658
  53:     0x7fd529069f57 - fold::noop_fold_method::closure.67217
  54:     0x7fd5290696c5 - fold::noop_fold_method::h2920979874065131956
  55:     0x7fd529038abb - middle::astencode::decode_inlined_item::h674342a5ff4e1a27Pqa
  56:     0x7fd52a9f81ff - trans::inline::instantiate_inline::closure.39610
  57:     0x7fd529427c2b - metadata::decoder::maybe_get_item_ast::h6b38702aa8f07983PDi
  58:     0x7fd52922aec6 - metadata::csearch::maybe_get_item_ast::hf5174e6ae59eb7b5o3k
  59:     0x7fd52a9f6a5d - trans::inline::instantiate_inline::h6a8d7203fac7c299bid
  60:     0x7fd52aa45d85 - trans::callee::trans_fn_ref_with_substs::h85a6252d422343b2qng
  61:     0x7fd52aa4452e - trans::callee::trans_fn_ref::h7eebc758d7f24cf00bg
  62:     0x7fd52aa5b344 - trans::meth::trans_method_callee::h175c0aff2b6fe67998x
  63:     0x7fd52aa59a19 - trans::callee::trans_call_inner::h18244630176801372264
  64:     0x7fd52aa638e9 - trans::expr::trans_rvalue_dps_unadjusted::h62a8f691df1cee3cqCi
  65:     0x7fd52aa154e6 - trans::expr::trans_into::h3bbb0e210c9fb401Vph
  66:     0x7fd52aa14684 - trans::controlflow::trans_stmt_semi::hd74052e320e3d8baK6d
  67:     0x7fd52aa15fc0 - trans::controlflow::trans_block::h4b526e186a057814x7d
  68:     0x7fd52aa640de - trans::expr::trans_rvalue_dps_unadjusted::h62a8f691df1cee3cqCi
  69:     0x7fd52aa154e6 - trans::expr::trans_into::h3bbb0e210c9fb401Vph
  70:     0x7fd52aa14684 - trans::controlflow::trans_stmt_semi::hd74052e320e3d8baK6d
  71:     0x7fd52aa15fc0 - trans::controlflow::trans_block::h4b526e186a057814x7d
  72:     0x7fd52aaed3b1 - trans::base::trans_closure::h194b7ad0474e43a46mt
  73:     0x7fd52a9fe948 - trans::base::trans_fn::h5416ef5d9cea730bZxt
  74:     0x7fd52a9fa6e1 - trans::base::trans_item::h2af153dd6f7fd52bRVt
  75:     0x7fd52aaf674c - trans::base::trans_crate::h5cb53f6b3e2377862Ru
  76:     0x7fd52b9f7613 - driver::phase_4_translate_to_llvm::h60575195b9fa298dENa
  77:     0x7fd52b9d305b - driver::compile_input::h9772b425fd1776fdNba
  78:     0x7fd52ba97697 - run_compiler::h17c28dbe4dd58e3bV5b
  79:     0x7fd52ba952c9 - thunk::F.Invoke<A, R>::invoke::h3041729087284544127
  80:     0x7fd52ba93f40 - rt::unwind::try::try_fn::h11775082019993619070
  81:     0x7fd52b457e38 - rust_try_inner
  82:     0x7fd52b457e25 - rust_try
  83:     0x7fd52ba946df - thunk::F.Invoke<A, R>::invoke::h10556879288050829464
  84:     0x7fd52b3d29b5 - sys::thread::thread_start::hfe8c2cac3ec4afcdr8E
  85:     0x7fd52520fe99 - start_thread
  86:     0x7fd52af8a4bc - <unknown>

Offending code:


impl Sub for BytePos {
    type Output = BytePos;

    fn sub(self, rhs: BytePos) -> BytePos {
        BytePos((self.to_usize() - rhs.to_usize()) as u32)
    }
}

and the code calling it:

    pub fn tr_span(&self, span: Span) -> Span {
        let imported_filemaps = &self.cdata.codemap_import_info[..];

        let filemap_index = {
            // Optimize for the case that most spans within a translated item
            // originate from the same filemap.
            let last_filemap_index = self.last_filemap_index.get();

            if span.lo >= imported_filemaps[last_filemap_index].original_start_pos &&
               span.hi <= imported_filemaps[last_filemap_index].original_end_pos {
                last_filemap_index
            } else {
                let mut a = 0;
                let mut b = imported_filemaps.len();

                while b - a > 1 {
                    let m = (a + b) / 2;
                    if imported_filemaps[m].original_start_pos > span.lo {
                        b = m;
                    } else {
                        a = m;
                    }
                }

                self.last_filemap_index.set(a);
                a
            }
        };

        let lo = (span.lo - imported_filemaps[filemap_index].original_start_pos) +
                  imported_filemaps[filemap_index].translated_filemap.start_pos;
        let hi = (span.hi - imported_filemaps[filemap_index].original_start_pos) +
                  imported_filemaps[filemap_index].translated_filemap.start_pos;

        codemap::mk_sp(lo, hi)
    }

We might want a bounds check there (resolving to 0?), but there seems to be something broken in the astencode code too.

cc @GuillaumeGomez @pnkfelix

Metadata

Metadata

Assignees

No one assigned

    Labels

    I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions