jasmin-lang / jasmin

Language for high-assurance and high-speed cryptography
MIT License
271 stars 55 forks source link

Late crash when using inline value as reg argument #866

Open vbgl opened 4 months ago

vbgl commented 4 months ago

Compiling the following program triggers an unfathomable internal error:

fn f(reg u32 x) -> reg u32 {
  return x;
}

export
fn main() -> reg u32 {
  inline u32 z;
  z = 42;
  reg u32 r;
  r = f(z);
  return r;
}

"get_pvar.jazz", line 10 (2-11): internal compilation error in function main: stack allocation: get_Pvar: variable expected Please report

Reported by @cos-imo.

eponier commented 4 months ago

Indeed, stack alloc assumes that every function argument is a variable, and badly fails otherwise. During typing, we reject most programs where it is not the case (r = f(42) is rejected, for instance), but with inline it is possible to pass typing and reach stack alloc with an argument that is not a variable.

I don't know what the proper fix is. Having stack alloc emit a nicer error is easy to do, while detecting this problem during typing seems hard, so I'd fix stack alloc. What do you think?

vbgl commented 4 months ago

I think that a checker after type-checking and before compilation should be able to properly address this kind of errors.

eponier commented 4 months ago

In general, do you think that we should remove everything not strictly related to typing from pretyping and put it in that pass?

vbgl commented 4 months ago

Precisely. That would also solve issues like #727.