10
10
#include " common.h"
11
11
#include " report.h"
12
12
13
+ #include < limits.h>
13
14
#include < stdlib.h>
14
15
#include < string.h>
15
16
@@ -80,7 +81,7 @@ void FlagParser::parseFlag() {
80
81
++Pos;
81
82
Value = Buffer + ValueStart;
82
83
}
83
- if (!runHandler (Name, Value))
84
+ if (!runHandler (Name, Value, ' = ' ))
84
85
reportError (" flag parsing failed." );
85
86
}
86
87
@@ -122,10 +123,16 @@ inline bool parseBool(const char *Value, bool *b) {
122
123
return false ;
123
124
}
124
125
125
- bool FlagParser::runHandler (const char *Name, const char *Value) {
126
+ void FlagParser::parseStringPair (const char *Name, const char *Value) {
127
+ if (!runHandler (Name, Value, ' \0 ' ))
128
+ reportError (" flag parsing failed." );
129
+ }
130
+
131
+ bool FlagParser::runHandler (const char *Name, const char *Value,
132
+ const char Sep) {
126
133
for (u32 I = 0 ; I < NumberOfFlags; ++I) {
127
134
const uptr Len = strlen (Flags[I].Name );
128
- if (strncmp (Name, Flags[I].Name , Len) != 0 || Name[Len] != ' = ' )
135
+ if (strncmp (Name, Flags[I].Name , Len) != 0 || Name[Len] != Sep )
129
136
continue ;
130
137
bool Ok = false ;
131
138
switch (Flags[I].Type ) {
@@ -136,8 +143,17 @@ bool FlagParser::runHandler(const char *Name, const char *Value) {
136
143
break ;
137
144
case FlagType::FT_int:
138
145
char *ValueEnd;
139
- *reinterpret_cast <int *>(Flags[I].Var ) =
140
- static_cast <int >(strtol (Value, &ValueEnd, 10 ));
146
+ long V = strtol (Value, &ValueEnd, 10 );
147
+ static_assert (INT_MAX <= LONG_MAX);
148
+ static_assert (INT_MIN >= LONG_MIN);
149
+ // strtol returns LONG_MAX on overflow and LONG_MIN on underflow.
150
+ // This is why we compare-equal here (and lose INT_MIN and INT_MAX as a
151
+ // value, but that's okay)
152
+ if (V >= INT_MAX || V <= INT_MIN) {
153
+ reportInvalidFlag (" int" , Value);
154
+ return false ;
155
+ }
156
+ *reinterpret_cast <int *>(Flags[I].Var ) = static_cast <int >(V);
141
157
Ok =
142
158
*ValueEnd == ' "' || *ValueEnd == ' \' ' || isSeparatorOrNull (*ValueEnd);
143
159
if (!Ok)
0 commit comments