libmain: fix UB in verbosity assignment

This was generating an out-of-range verbosity value. We should just
process it as an int and then convert to verbosity with a clamping
function, which trivially avoids any domain type violations.

Change-Id: I0ed20da8e1496a1225ff3008b76827d99265d404
This commit is contained in:
jade 2024-06-18 19:11:44 -07:00
parent e0a3a5f226
commit f2fff1faa4
3 changed files with 12 additions and 2 deletions

View file

@ -1,5 +1,6 @@
#include "common-args.hh" #include "common-args.hh"
#include "args/root.hh" #include "args/root.hh"
#include "error.hh"
#include "globals.hh" #include "globals.hh"
#include "loggers.hh" #include "loggers.hh"
#include "logging.hh" #include "logging.hh"
@ -14,14 +15,14 @@ MixCommonArgs::MixCommonArgs(const std::string & programName)
.shortName = 'v', .shortName = 'v',
.description = "Increase the logging verbosity level.", .description = "Increase the logging verbosity level.",
.category = loggingCategory, .category = loggingCategory,
.handler = {[]() { verbosity = (Verbosity) (verbosity + 1); }}, .handler = {[]() { verbosity = verbosityFromIntClamped(int(verbosity) + 1); }},
}); });
addFlag({ addFlag({
.longName = "quiet", .longName = "quiet",
.description = "Decrease the logging verbosity level.", .description = "Decrease the logging verbosity level.",
.category = loggingCategory, .category = loggingCategory,
.handler = {[]() { verbosity = verbosity > lvlError ? (Verbosity) (verbosity - 1) : lvlError; }}, .handler = {[]() { verbosity = verbosityFromIntClamped(int(verbosity) - 1); }},
}); });
addFlag({ addFlag({

View file

@ -45,6 +45,8 @@ typedef enum {
lvlVomit lvlVomit
} Verbosity; } Verbosity;
Verbosity verbosityFromIntClamped(int val);
/** /**
* The lines of code surrounding an error. * The lines of code surrounding an error.
*/ */

View file

@ -5,6 +5,7 @@
#include "position.hh" #include "position.hh"
#include "terminal.hh" #include "terminal.hh"
#include <algorithm>
#include <atomic> #include <atomic>
#include <sstream> #include <sstream>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
@ -110,6 +111,12 @@ public:
Verbosity verbosity = lvlInfo; Verbosity verbosity = lvlInfo;
Verbosity verbosityFromIntClamped(int val)
{
int clamped = std::clamp(val, int(lvlError), int(lvlVomit));
return static_cast<Verbosity>(clamped);
}
void writeToStderr(std::string_view s) void writeToStderr(std::string_view s)
{ {
try { try {