@@ -78,10 +78,11 @@ static int appendUnsigned(char **Buffer, const char *BufferEnd, u64 Num,
78
78
static int appendSignedDecimal (char **Buffer, const char *BufferEnd, s64 Num,
79
79
u8 MinNumberLength, bool PadWithZero) {
80
80
const bool Negative = (Num < 0 );
81
- return appendNumber (Buffer, BufferEnd,
82
- static_cast <u64 >(Negative ? -Num : Num), 10 ,
83
- MinNumberLength, PadWithZero, Negative,
84
- /* Upper=*/ false );
81
+ const u64 UnsignedNum = (Num == INT64_MIN)
82
+ ? static_cast <u64 >(INT64_MAX) + 1
83
+ : static_cast <u64 >(Negative ? -Num : Num);
84
+ return appendNumber (Buffer, BufferEnd, UnsignedNum, 10 , MinNumberLength,
85
+ PadWithZero, Negative, /* Upper=*/ false );
85
86
}
86
87
87
88
// Use the fact that explicitly requesting 0 Width (%0s) results in UB and
@@ -158,16 +159,18 @@ int formatString(char *Buffer, uptr BufferLength, const char *Format,
158
159
CHECK (!((Precision >= 0 || LeftJustified) && *Cur != ' s' ));
159
160
switch (*Cur) {
160
161
case ' d' : {
161
- DVal = HaveLL ? va_arg (Args, s64)
162
- : HaveZ ? va_arg (Args, sptr) : va_arg (Args, int );
162
+ DVal = HaveLL ? va_arg (Args, s64)
163
+ : HaveZ ? va_arg (Args, sptr)
164
+ : va_arg (Args, int );
163
165
Res += appendSignedDecimal (&Buffer, BufferEnd, DVal, Width, PadWithZero);
164
166
break ;
165
167
}
166
168
case ' u' :
167
169
case ' x' :
168
170
case ' X' : {
169
- UVal = HaveLL ? va_arg (Args, u64 )
170
- : HaveZ ? va_arg (Args, uptr) : va_arg (Args, unsigned );
171
+ UVal = HaveLL ? va_arg (Args, u64 )
172
+ : HaveZ ? va_arg (Args, uptr)
173
+ : va_arg (Args, unsigned );
171
174
const bool Upper = (*Cur == ' X' );
172
175
Res += appendUnsigned (&Buffer, BufferEnd, UVal, (*Cur == ' u' ) ? 10 : 16 ,
173
176
Width, PadWithZero, Upper);
0 commit comments