Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

std: Render large exit codes as hex on Windows #57473

Merged
merged 1 commit into from
Jan 13, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion src/libstd/sys/windows/process.rs
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,16 @@ impl From<c::DWORD> for ExitStatus {

impl fmt::Display for ExitStatus {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "exit code: {}", self.0)
// Windows exit codes with the high bit set typically mean some form of
// unhandled exception or warning. In this scenario printing the exit
// code in decimal doesn't always make sense because it's a very large
// and somewhat gibberish number. The hex code is a bit more
// recognizable and easier to search for, so print that.
if self.0 & 0x80000000 != 0 {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be nice to have a comment explaining this heuristic briefly.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@varkor Apparently, ExitProcess is a newtype for u32 on Windows. And Windows uses sometimes system error codes, sometimes NTSTATUS.

The self.0 & 0x80000000 != 0 for u32 acts like self.0 < 0 for i32, but I'd render informational status codes (the ones within 0x40000000 − 0x7FFFFFFF range) as hexadecimal as well.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure why only large codes are printed in hexadecimal. What's the problem with printing all codes in hexadecimal? We wouldn't need any heuristics and comments then.
(Small codes are documented and searchable in both hexadecimal and decimal forms.)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are there any examples of exceptions crashing the process that have an informational status codes though?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@petrochenkov Because system error codes are decimal. For example, 12000 - 12175 is reserved for Internet Error codes. So, displaying it in hexadecimal would be the opposite of this PR.

write!(f, "exit code: {:#x}", self.0)
} else {
write!(f, "exit code: {}", self.0)
}
}
}

Expand Down