1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-07-05 16:31:47 +02:00

Make abort() call sites log first

This commit is contained in:
Robert Hensing 2024-07-20 22:46:09 +02:00
parent e48e0cbab0
commit 3172e88af5
35 changed files with 88 additions and 45 deletions

View file

@ -6,6 +6,8 @@
#include <vector>
#include <limits>
#include "error.hh"
namespace nix {
/**
@ -30,7 +32,7 @@ private:
auto & addChunk()
{
if (size_ >= std::numeric_limits<uint32_t>::max() - ChunkSize)
abort();
unreachable();
chunks.emplace_back();
chunks.back().reserve(ChunkSize);
return chunks.back();

View file

@ -430,4 +430,16 @@ std::ostream & showErrorInfo(std::ostream & out, const ErrorInfo & einfo, bool s
return out;
}
void panic(std::string_view msg)
{
printError(msg);
printError("This was a fatal error, aborting.");
abort();
}
void panic(const char * file, int line, const char * func)
{
panic(std::string("Unexpected condition in ") + func + " at " + file + ":" + std::to_string(line));
}
}

View file

@ -273,4 +273,28 @@ using NativeSysError =
*/
void throwExceptionSelfCheck();
/**
* Print a message and abort().
*
* @note: This assumes that the logger is operational
*/
[[noreturn]]
void panic(std::string_view msg);
/**
* Print a basic error message with source position and abort().
* Use the unreachable macro to call this.
*
* @note: This assumes that the logger is operational
*/
[[noreturn]]
void panic(const char * file, int line, const char * func);
/**
* Print a basic error message with source position and abort().
*
* @note: This assumes that the logger is operational
*/
#define unreachable() (panic(__FILE__, __LINE__, __func__))
}

View file

@ -63,7 +63,7 @@ std::string_view renderFileIngestionMethod(FileIngestionMethod method)
case FileIngestionMethod::Git:
return "git";
default:
abort();
unreachable();
}
}

View file

@ -53,7 +53,7 @@ void copyRecursive(
throw Error("file '%1%' has an unsupported type", from);
default:
abort();
unreachable();
}
}

View file

@ -201,7 +201,7 @@ std::optional<Mode> convertMode(SourceAccessor::Type type)
case SourceAccessor::tRegular: return Mode::Regular;
case SourceAccessor::tDirectory: return Mode::Directory;
case SourceAccessor::tMisc: return std::nullopt;
default: abort();
default: unreachable();
}
}

View file

@ -25,7 +25,7 @@ static size_t regularHashSize(HashAlgorithm type) {
case HashAlgorithm::SHA256: return sha256HashSize;
case HashAlgorithm::SHA512: return sha512HashSize;
}
abort();
unreachable();
}

View file

@ -189,7 +189,7 @@ struct JSONLogger : Logger {
else if (f.type == Logger::Field::tString)
arr.push_back(f.s);
else
abort();
unreachable();
}
void write(const nlohmann::json & json)

View file

@ -260,7 +260,7 @@ std::unique_ptr<FinishSink> sourceToSink(std::function<void(Source &)> fun)
});
}
if (!*coro) { abort(); }
if (!*coro) { unreachable(); }
if (!cur.empty()) {
CoroutineContext ctx;
@ -271,12 +271,12 @@ std::unique_ptr<FinishSink> sourceToSink(std::function<void(Source &)> fun)
void finish() override
{
if (!coro) return;
if (!*coro) abort();
if (!*coro) unreachable();
{
CoroutineContext ctx;
(*coro)(true);
}
if (*coro) abort();
if (*coro) unreachable();
}
};
@ -316,7 +316,7 @@ std::unique_ptr<Source> sinkToSource(
});
}
if (!*coro) { eof(); abort(); }
if (!*coro) { eof(); unreachable(); }
if (pos == cur.size()) {
if (!cur.empty()) {

View file

@ -7,6 +7,8 @@
#include <condition_variable>
#include <cassert>
#include "error.hh"
namespace nix {
/**
@ -47,7 +49,7 @@ public:
friend SyncBase;
Lock(SyncBase * s) : s(s), lk(s->mutex) { }
public:
Lock(Lock && l) : s(l.s) { abort(); }
Lock(Lock && l) : s(l.s) { unreachable(); }
Lock(const Lock & l) = delete;
~Lock() { }

View file

@ -40,7 +40,9 @@ public:
#endif
;
auto count = poll(fds, 1, -1);
if (count == -1) abort(); // can't happen
if (count == -1)
unreachable();
/* This shouldn't happen, but can on macOS due to a bug.
See rdar://37550628.

View file

@ -182,7 +182,7 @@ static pid_t doFork(bool allowVfork, ChildWrapperFunction & fun)
#endif
if (pid != 0) return pid;
fun();
abort();
unreachable();
}