Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign upInvestigate how LLVM deals with huge stack frames #18072
Comments
arielb1
referenced this issue
Oct 16, 2014
Closed
Properly fail on type size overflows in LLVM #18041
kmcallister
added
A-LLVM
A-codegen
I-wrong
labels
Oct 16, 2014
This comment has been minimized.
This comment has been minimized.
|
Triage: I'm not aware of anyone having done any investigation since. |
brson
added
P-low
I-unsound 💥
labels
Jun 1, 2017
This comment has been minimized.
This comment has been minimized.
|
Is any of this actionable? Is the UB documented somewhere, or described by a bug report? Given that this bug is going on three years old, it's also possible that this isn't relevant anymore. Can someone demonstrate this with a test case? If not, I'd consider closing this. |
Mark-Simulacrum
added
C-bug
and removed
C-enhancement
I-wrong
labels
Jul 22, 2017
bstrie
referenced this issue
Sep 17, 2017
Open
borrowed referent of a `&T` sometimes incorrectly allowed #38899
This comment has been minimized.
This comment has been minimized.
|
It's been three years since this was filed and we still have no clue what this is referring to, no reproduction, and no way to know if this hasn't already been long since fixed on LLVM's side. Closing this, but feel free to reopen if anyone can find a relevant LLVM bug (though #45839 (comment) has set the precedent of "It doesn't make sense to have a bug for every LLVM bug", so use your discretion). |
bstrie
closed this
Nov 17, 2017
This comment has been minimized.
This comment has been minimized.
|
I'm not aware of any specific undefined behavior, though there could well be bugs. Here's an experiment: pub fn bar(foo: &Fn(&[u8], &[u8], &[u8], &[u8], &[u8], &[u8])) {
let a = [0u8; 0x7fff_ffff];
let b = [0u8; 0x7fff_ffff];
let c = [0u8; 0x7fff_ffff];
let d = [0u8; 0x7fff_ffff];
let e = [0u8; 0x7fff_ffff];
let f = [0u8; 0x7fff_ffff];
foo(&a, &b, &c, &d, &e, &f);
}Compile with pushl %ebp
pushl %ebx
pushl %edi
pushl %esi
movl $12884901884, %eax
calll __rust_probestack
subl %eax, %esp12884901884 is the size we need, but this isn't valid 32-bit x86. llvm-mc silently wraps it, which is also what happens when LLVM uses it in integrated-as mode. GAS also wraps it, though at least gives a warning:
I've now filed https://bugs.llvm.org/show_bug.cgi?id=35345 concerning this. Since this code is entirely pathological, it seems reasonable to have compilers just reject it. I assume the fix for the above should be to have LLVM use If Rust ever has the ability to emit dynamic-sized allocas, that may introduce other concerns not covered here. |
bstrie
reopened this
Nov 17, 2017
This comment has been minimized.
This comment has been minimized.
|
@sunfishcode Thank you for investigating! I've reopened this for the time being, now that we have something to actually go on. As for alloca, you may be interested in this RFC: rust-lang/rfcs#1909 , which is currently in its final comment period, and your comments would be very welcome. :) |
arielb1 commentedOct 15, 2014
According to @thestinger, LLVM has UB when dealing with stack frames that have size of the order of magnitude of the address space. Investigate this and add the needed fixes.
This is related to #17913 and not dealt with in #18041.