Add diagnostic explaining STATUS_STACK_BUFFER_OVERRUN not only being
used for stack buffer overruns if link.exe exits with that exit code `STATUS_STACK_BUFFER_OVERRUN` is also used for fast abnormal program termination, e.g. by abort(). Emit a special diagnostic to let people know that this most likely doesn't indicate a stack buffer overrun.
This commit is contained in:
@@ -178,6 +178,9 @@ codegen_ssa_ld64_unimplemented_modifier = `as-needed` modifier not implemented y
|
||||
|
||||
codegen_ssa_lib_def_write_failure = failed to write lib.def file: {$error}
|
||||
|
||||
codegen_ssa_link_exe_status_stack_buffer_overrun = 0xc0000409 is `STATUS_STACK_BUFFER_OVERRUN`
|
||||
.note = this may have been caused by a program abort and not a stack buffer overrun
|
||||
|
||||
codegen_ssa_link_exe_unexpected_error = `link.exe` returned an unexpected error
|
||||
|
||||
codegen_ssa_link_script_unavailable = can only use link script when linking with GNU-like linker
|
||||
|
||||
@@ -880,6 +880,14 @@ fn link_natively(
|
||||
windows_registry::find_tool(&sess.target.arch, "link.exe").is_some();
|
||||
|
||||
sess.dcx().emit_note(errors::LinkExeUnexpectedError);
|
||||
|
||||
// STATUS_STACK_BUFFER_OVERRUN is also used for fast abnormal program termination, e.g. abort().
|
||||
// Emit a special diagnostic to let people know that this most likely doesn't indicate a stack buffer overrun.
|
||||
const STATUS_STACK_BUFFER_OVERRUN: i32 = 0xc0000409u32 as _;
|
||||
if code == STATUS_STACK_BUFFER_OVERRUN {
|
||||
sess.dcx().emit_note(errors::LinkExeStatusStackBufferOverrun);
|
||||
}
|
||||
|
||||
if is_vs_installed && has_linker {
|
||||
// the linker is broken
|
||||
sess.dcx().emit_note(errors::RepairVSBuildTools);
|
||||
|
||||
@@ -550,6 +550,11 @@ impl<G: EmissionGuarantee> Diagnostic<'_, G> for LinkingFailed<'_> {
|
||||
#[diag(codegen_ssa_link_exe_unexpected_error)]
|
||||
pub(crate) struct LinkExeUnexpectedError;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(codegen_ssa_link_exe_status_stack_buffer_overrun)]
|
||||
#[note]
|
||||
pub(crate) struct LinkExeStatusStackBufferOverrun;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(codegen_ssa_repair_vs_build_tools)]
|
||||
pub(crate) struct RepairVSBuildTools;
|
||||
|
||||
Reference in New Issue
Block a user