Skip to content

ConstEval/ConstProp: get rid of Panic error kind #66902

Closed
@RalfJung

Description

@RalfJung
Member

With the Miri engine now having support for properly executing panics, a panicking program does not really constitute an "interpreter error" any more. So we should get rid of the InterpError::Panic variant.

  • We'll need to decide what else to do with the throw_panic! that still exist. This one I think should be throw_ub! instead; same for the "division/remainder by zero" in this file. With well-formed MIR I think those are all unreachable, but I see no harm in letting Miri also support some "reasonable" MIR that rustc would never emit (such as omitting the bounds check on an array access, or the div-by-zero check). Overflowing pointer arithmetic should also be UB I think.
  • ConstEval should probably format an error message directly when a panic occurs (here or in the new assert_panic hook added by Miri engine: proper support for Assert MIR terminators #66874). This could be propagated outwards via a new MachineError(String) variant of InterpError, if nothing else fits.
  • I am not sure what ConstProp should do. The throw_panic! mentioned above are, I think, currently actually hit by ConstProp -- but maybe those same errors can be better shown by determining that the condition of an Assert terminator is constant, and indeed that might explain why we currently sometimes have duplicate error messages. It also contains a throw_panic! here.

Cc @oli-obk @wesleywiser

Activity

added
A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)
C-cleanupCategory: PRs that clean code up or issues documenting cleanup.
T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
on Nov 30, 2019
wesleywiser

wesleywiser commented on Nov 30, 2019

@wesleywiser
Member

ConstProp -- but maybe those same errors can be better shown by determining that the condition of an Assert terminator is constant

Unless I'm not understanding what you're saying, that's exactly how it currently works in ConstProp:

TerminatorKind::Assert { expected, ref msg, ref mut cond, .. } => {
if let Some(value) = self.eval_operand(&cond, source_info) {
trace!("assertion on {:?} should be {:?}", value, expected);
let expected = ScalarMaybeUndef::from(Scalar::from_bool(*expected));
let value_const = self.ecx.read_scalar(value).unwrap();
if expected != value_const {

RalfJung

RalfJung commented on Dec 1, 2019

@RalfJung
MemberAuthor

that's exactly how it currently works in ConstProp

Yeah I think that is what I imagined. So I will start by experimenting with replacing the throw_panic! that we have with throw_ub!.

RalfJung

RalfJung commented on Dec 1, 2019

@RalfJung
MemberAuthor

I will start by experimenting with replacing the throw_panic! that we have with throw_ub!.

PR opened at #66927.

RalfJung

RalfJung commented on Dec 1, 2019

@RalfJung
MemberAuthor

With well-formed MIR I think those are all unreachable

Turns out that assumption is wrong: the MIR of promoteds actually is not well-formed in this sense; it can contain unchecked array/slice accesses.

added 3 commits that reference this issue on Dec 2, 2019

Rollup merge of rust-lang#66926 - RalfJung:miri-stop, r=oli-obk

cd47551

Rollup merge of rust-lang#66927 - RalfJung:engines-dont-panic, r=oli-obk

c1190d4

Rollup merge of rust-lang#66927 - RalfJung:engines-dont-panic, r=oli-obk

eceacd2

3 remaining items

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)C-cleanupCategory: PRs that clean code up or issues documenting cleanup.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      Participants

      @RalfJung@wesleywiser@jonas-schievink

      Issue actions

        ConstEval/ConstProp: get rid of `Panic` error kind · Issue #66902 · rust-lang/rust