Skip to content

Commit 5df6638

Browse files
committed
Fix pprintint potential UB due to int conversion, remove warning
1 parent 3ae5eda commit 5df6638

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
- Fix CMAKE warnings on custom commands with TARGET and DEPENDS (CMP0175).
6666
- Issue warnings on some potential name conflicts that can break C source
6767
and add `-s` option to silence warnings (#354).
68+
- Fix potential UB in pprintint due to integer promotion, and silence warnings.
6869

6970
## [0.6.1]
7071

include/flatcc/portable/pprintint.h

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ extern "C" {
7474
#ifndef UINT8_MAX
7575
#include <stdint.h>
7676
#endif
77+
#include <string.h> /* memcpy */
7778

7879
#include "pattributes.h" /* fallthrough */
7980

@@ -382,45 +383,49 @@ static int print_uint64(uint64_t n, char *p)
382383
static int print_int8(int8_t n, char *p)
383384
{
384385
int sign;
386+
uint8_t v = (uint8_t)n;
385387

386388
if ((sign = n < 0)) {
387389
*p++ = '-';
388-
n = -n;
390+
v = (uint8_t)-v;
389391
}
390-
return print_uint8((uint8_t)n, p) + sign;
392+
return print_uint8(v, p) + sign;
391393
}
392394

393395
static int print_int16(int16_t n, char *p)
394396
{
395397
int sign;
398+
uint16_t v = (uint16_t)n;
396399

397400
if ((sign = n < 0)) {
398401
*p++ = '-';
399-
n = -n;
402+
v = (uint16_t)-v;
400403
}
401-
return print_uint16((uint16_t)n, p) + sign;
404+
return print_uint16(v, p) + sign;
402405
}
403406

404407
static int print_int32(int32_t n, char *p)
405408
{
406409
int sign;
410+
uint32_t v = (uint32_t)n;
407411

408412
if ((sign = n < 0)) {
409413
*p++ = '-';
410-
n = -n;
414+
v = (uint32_t)-v;
411415
}
412-
return print_uint32((uint32_t)n, p) + sign;
416+
return print_uint32(v, p) + sign;
413417
}
414418

415419
static int print_int64(int64_t n, char *p)
416420
{
417421
int sign;
422+
uint64_t v = (uint64_t)n;
418423

419424
if ((sign = n < 0)) {
420425
*p++ = '-';
421-
n = -n;
426+
v = (uint64_t)-v;
422427
}
423-
return print_uint64((uint64_t)n, p) + sign;
428+
return print_uint64(v, p) + sign;
424429
}
425430

426431
#define __define_print_int_simple(NAME, UNAME, T, UT) \

0 commit comments

Comments
 (0)