Specify FailureDetails for default exit values not expected to be used

The pre-existing INTERNAL values ought to be overwritten before they're
used. Replacing them with CrashFailureDetail values provides more context
in case that ever happens.

RELNOTES: None.
PiperOrigin-RevId: 313629803
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildResult.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildResult.java
index 22f4672..8139136 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildResult.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildResult.java
@@ -27,6 +27,7 @@
 import com.google.devtools.build.lib.buildeventstream.BuildToolLogs;
 import com.google.devtools.build.lib.buildeventstream.BuildToolLogs.LogFileEntry;
 import com.google.devtools.build.lib.skyframe.AspectValueKey.AspectKey;
+import com.google.devtools.build.lib.util.CrashFailureDetails;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.ExitCode;
 import com.google.devtools.build.lib.util.Pair;
@@ -51,8 +52,7 @@
   private Throwable crash = null;
   private boolean catastrophe = false;
   private boolean stopOnFirstFailure;
-  private DetailedExitCode detailedExitCode =
-      DetailedExitCode.justExitCode(ExitCode.BLAZE_INTERNAL_ERROR);
+  @Nullable private DetailedExitCode detailedExitCode;
 
   private BuildConfigurationCollection configurations;
   private Collection<ConfiguredTarget> actualTargets;
@@ -110,7 +110,7 @@
 
   /** True iff the build request has been successfully completed. */
   public boolean getSuccess() {
-    return detailedExitCode.isSuccess();
+    return detailedExitCode != null && detailedExitCode.isSuccess();
   }
 
   /**
@@ -118,15 +118,17 @@
    * to complete the command with.
    */
   public DetailedExitCode getDetailedExitCode() {
-    return detailedExitCode;
+    if (detailedExitCode != null) {
+      return detailedExitCode;
+    }
+    return CrashFailureDetails.detailedExitCodeForThrowable(
+        new IllegalStateException("Unspecified DetailedExitCode"));
   }
 
-  /**
-   * Sets the RuntimeException / Error that induced a Blaze crash.
-   */
+  /** Sets the RuntimeException / Error that induced a Blaze crash. */
   public void setUnhandledThrowable(Throwable crash) {
-    Preconditions.checkState(crash == null ||
-        ((crash instanceof RuntimeException) || (crash instanceof Error)));
+    Preconditions.checkState(
+        crash == null || ((crash instanceof RuntimeException) || (crash instanceof Error)));
     this.crash = crash;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
index ff60b5d..5eaa996 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
@@ -47,6 +47,7 @@
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.server.FailureDetails.Interrupted.Code;
 import com.google.devtools.build.lib.util.AbruptExitException;
+import com.google.devtools.build.lib.util.CrashFailureDetails;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.ExitCode;
 import com.google.devtools.build.lib.util.InterruptedFailureDetails;
@@ -280,8 +281,7 @@
     maybeSetStopOnFirstFailure(request, result);
     int startSuspendCount = suspendCount();
     Throwable catastrophe = null;
-    DetailedExitCode detailedExitCode =
-        DetailedExitCode.justExitCode(ExitCode.BLAZE_INTERNAL_ERROR);
+    DetailedExitCode detailedExitCode = null;
     try {
       buildTargets(request, result, validator);
       detailedExitCode = DetailedExitCode.success();
@@ -335,9 +335,15 @@
       reportExceptionError(e);
       result.setCatastrophe();
     } catch (Throwable throwable) {
+      detailedExitCode = CrashFailureDetails.detailedExitCodeForThrowable(throwable);
       catastrophe = throwable;
       Throwables.propagate(throwable);
     } finally {
+      if (detailedExitCode == null) {
+        detailedExitCode =
+            CrashFailureDetails.detailedExitCodeForThrowable(
+                new IllegalStateException("Unspecified DetailedExitCode"));
+      }
       stopRequest(result, catastrophe, detailedExitCode, startSuspendCount);
     }