eyalroz / printf

Tiny, fast(ish), self-contained, fully loaded printf, sprinf etc. implementation; particularly useful in embedded systems.
MIT License
419 stars 52 forks source link

Fix -Wmaybe uninitialized #163

Closed andrewvoznytsa closed 11 months ago

andrewvoznytsa commented 12 months ago

This little tweak fixes clang's "unknown warning group -Wmaybe-uninitialized".

eyalroz commented 12 months ago

I don't know that there's a maybe-uninitialized variable used in the code... where exactly?

andrewvoznytsa commented 12 months ago

No idea. From my perspective the problem is that the code assumes that it is compiled by gcc and with -Wmaybe-uninitialized support which is not always the case (clang-16 does not support such option, for example). This PR brings potential solution for this problem. If there is no real need in -Wmaybe-uninitialized then it should be removed and this PR dropped.

eyalroz commented 12 months ago

Oh, ok, now I see what you mean. However - the code builds just fine with clang 16.0.6. Can you paste the exact error output that you're getting?

andrewvoznytsa commented 11 months ago

Here it is:

clang -MMD -MF obj/third_party/printf/printf/printf.o.d -DPRINTF_SUPPORT_HUMAN_STYLE_SPECIFIERS -D_DEBUG -I../third_party/printf/src/src -fno-strict-aliasing -funwind-tables -fPIC --gcc-toolchain=../../../../../usr -fcolor-diagnostics --target=x86_64-linux-gnu -fstack-protector-strong -pthread -O0 -fno-omit-frame-pointer -gdwarf-3 -g2 -fvisibility=hidden -c ../third_party/printf/src/src/printf/printf.c -o obj/third_party/printf/printf/printf.o ../third_party/printf/src/src/printf/printf.c:942:32: warning: unknown warning group '-Wmaybe-uninitialized', ignored [-Wunknown-warning-option]

pragma GCC diagnostic ignored "-Wmaybe-uninitialized"

andrewvoznytsa commented 11 months ago

clang -v clang version 16.0.6 Target: x86_64-unknown-linux-gnu

andrewvoznytsa commented 11 months ago

And this one

clang -dM -E - < /dev/null

define _LP64 1

define __ATOMIC_ACQUIRE 2

define __ATOMIC_ACQ_REL 4

define __ATOMIC_CONSUME 1

define __ATOMIC_RELAXED 0

define __ATOMIC_RELEASE 3

define __ATOMIC_SEQ_CST 5

define __BIGGEST_ALIGNMENT__ 16

define __BITINT_MAXWIDTH__ 8388608

define __BOOL_WIDTH__ 8

define __BYTE_ORDER ORDER_LITTLE_ENDIAN__

define __CHAR16_TYPE__ unsigned short

define __CHAR32_TYPE__ unsigned int

define __CHAR_BIT__ 8

define __CLANG_ATOMIC_BOOL_LOCK_FREE 2

define __CLANG_ATOMIC_CHAR16_T_LOCK_FREE 2

define __CLANG_ATOMIC_CHAR32_T_LOCK_FREE 2

define __CLANG_ATOMIC_CHAR_LOCK_FREE 2

define __CLANG_ATOMIC_INT_LOCK_FREE 2

define __CLANG_ATOMIC_LLONG_LOCK_FREE 2

define __CLANG_ATOMIC_LONG_LOCK_FREE 2

define __CLANG_ATOMIC_POINTER_LOCK_FREE 2

define __CLANG_ATOMIC_SHORT_LOCK_FREE 2

define __CLANG_ATOMIC_WCHAR_T_LOCK_FREE 2

define __CONSTANT_CFSTRINGS__ 1

define DBL_DECIMAL_DIG 17

define DBL_DENORM_MIN 4.9406564584124654e-324

define __DBL_DIG__ 15

define __DBL_EPSILON__ 2.2204460492503131e-16

define DBL_HAS_DENORM 1

define DBL_HAS_INFINITY 1

define __DBL_HAS_QUIET_NAN__ 1

define DBL_MANT_DIG 53

define __DBL_MAX_10_EXP__ 308

define DBL_MAX_EXP 1024

define __DBL_MAX__ 1.7976931348623157e+308

define __DBL_MIN_10_EXP__ (-307)

define DBL_MIN_EXP (-1021)

define __DBL_MIN__ 2.2250738585072014e-308

define __DECIMAL_DIG LDBL_DECIMAL_DIG__

define ELF 1

define FINITE_MATH_ONLY 0

define FLOAT128 1

define FLT16_DECIMAL_DIG 5

define FLT16_DENORM_MIN 5.9604644775390625e-8F16

define __FLT16_DIG__ 3

define __FLT16_EPSILON__ 9.765625e-4F16

define FLT16_HAS_DENORM 1

define FLT16_HAS_INFINITY 1

define __FLT16_HAS_QUIET_NAN__ 1

define FLT16_MANT_DIG 11

define __FLT16_MAX_10_EXP__ 4

define FLT16_MAX_EXP 16

define __FLT16_MAX__ 6.5504e+4F16

define __FLT16_MIN_10_EXP__ (-4)

define FLT16_MIN_EXP (-13)

define __FLT16_MIN__ 6.103515625e-5F16

define FLT_DECIMAL_DIG 9

define FLT_DENORM_MIN 1.40129846e-45F

define __FLT_DIG__ 6

define __FLT_EPSILON__ 1.19209290e-7F

define FLT_HAS_DENORM 1

define FLT_HAS_INFINITY 1

define __FLT_HAS_QUIET_NAN__ 1

define FLT_MANT_DIG 24

define __FLT_MAX_10_EXP__ 38

define FLT_MAX_EXP 128

define __FLT_MAX__ 3.40282347e+38F

define __FLT_MIN_10_EXP__ (-37)

define FLT_MIN_EXP (-125)

define __FLT_MIN__ 1.17549435e-38F

define __FLT_RADIX__ 2

define FXSR 1

define __GCC_ASM_FLAG_OUTPUTS__ 1

define __GCC_ATOMIC_BOOL_LOCK_FREE 2

define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2

define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2

define __GCC_ATOMIC_CHAR_LOCK_FREE 2

define __GCC_ATOMIC_INT_LOCK_FREE 2

define __GCC_ATOMIC_LLONG_LOCK_FREE 2

define __GCC_ATOMIC_LONG_LOCK_FREE 2

define __GCC_ATOMIC_POINTER_LOCK_FREE 2

define __GCC_ATOMIC_SHORT_LOCK_FREE 2

define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1

define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2

define __GCC_HAVE_DWARF2_CFI_ASM 1

define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1

define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1

define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1

define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1

define __GNUC_MINOR__ 2

define __GNUC_PATCHLEVEL__ 1

define GNUC_STDC_INLINE 1

define GNUC 4

define __GXX_ABI_VERSION 1002

define INT16_C_SUFFIX

define __INT16_FMTd__ "hd"

define __INT16_FMTi__ "hi"

define __INT16_MAX__ 32767

define __INT16_TYPE__ short

define INT32_C_SUFFIX

define __INT32_FMTd__ "d"

define __INT32_FMTi__ "i"

define __INT32_MAX__ 2147483647

define __INT32_TYPE__ int

define INT64_C_SUFFIX L

define __INT64_FMTd__ "ld"

define __INT64_FMTi__ "li"

define __INT64_MAX__ 9223372036854775807L

define __INT64_TYPE__ long int

define INT8_C_SUFFIX

define __INT8_FMTd__ "hhd"

define __INT8_FMTi__ "hhi"

define __INT8_MAX__ 127

define __INT8_TYPE__ signed char

define INTMAX_C_SUFFIX L

define __INTMAX_FMTd__ "ld"

define __INTMAX_FMTi__ "li"

define __INTMAX_MAX__ 9223372036854775807L

define __INTMAX_TYPE__ long int

define __INTMAX_WIDTH__ 64

define __INTPTR_FMTd__ "ld"

define __INTPTR_FMTi__ "li"

define __INTPTR_MAX__ 9223372036854775807L

define __INTPTR_TYPE__ long int

define __INTPTR_WIDTH__ 64

define INT_FAST16_FMTd "hd"

define INT_FAST16_FMTi "hi"

define INT_FAST16_MAX 32767

define INT_FAST16_TYPE short

define INT_FAST16_WIDTH 16

define INT_FAST32_FMTd "d"

define INT_FAST32_FMTi "i"

define INT_FAST32_MAX 2147483647

define INT_FAST32_TYPE int

define INT_FAST32_WIDTH 32

define INT_FAST64_FMTd "ld"

define INT_FAST64_FMTi "li"

define INT_FAST64_MAX 9223372036854775807L

define INT_FAST64_TYPE long int

define INT_FAST64_WIDTH 64

define INT_FAST8_FMTd "hhd"

define INT_FAST8_FMTi "hhi"

define INT_FAST8_MAX 127

define INT_FAST8_TYPE signed char

define INT_FAST8_WIDTH 8

define INT_LEAST16_FMTd "hd"

define INT_LEAST16_FMTi "hi"

define INT_LEAST16_MAX 32767

define INT_LEAST16_TYPE short

define INT_LEAST16_WIDTH 16

define INT_LEAST32_FMTd "d"

define INT_LEAST32_FMTi "i"

define INT_LEAST32_MAX 2147483647

define INT_LEAST32_TYPE int

define INT_LEAST32_WIDTH 32

define INT_LEAST64_FMTd "ld"

define INT_LEAST64_FMTi "li"

define INT_LEAST64_MAX 9223372036854775807L

define INT_LEAST64_TYPE long int

define INT_LEAST64_WIDTH 64

define INT_LEAST8_FMTd "hhd"

define INT_LEAST8_FMTi "hhi"

define INT_LEAST8_MAX 127

define INT_LEAST8_TYPE signed char

define INT_LEAST8_WIDTH 8

define __INT_MAX__ 2147483647

define __INT_WIDTH__ 32

define LDBL_DECIMAL_DIG 21

define LDBL_DENORM_MIN 3.64519953188247460253e-4951L

define __LDBL_DIG__ 18

define __LDBL_EPSILON__ 1.08420217248550443401e-19L

define LDBL_HAS_DENORM 1

define LDBL_HAS_INFINITY 1

define __LDBL_HAS_QUIET_NAN__ 1

define LDBL_MANT_DIG 64

define __LDBL_MAX_10_EXP__ 4932

define LDBL_MAX_EXP 16384

define __LDBL_MAX__ 1.18973149535723176502e+4932L

define __LDBL_MIN_10_EXP__ (-4931)

define LDBL_MIN_EXP (-16381)

define __LDBL_MIN__ 3.36210314311209350626e-4932L

define __LITTLE_ENDIAN__ 1

define __LLONG_WIDTH__ 64

define LONG_LONG_MAX 9223372036854775807LL

define __LONG_MAX__ 9223372036854775807L

define __LONG_WIDTH__ 64

define LP64 1

define MMX 1

define __NO_INLINE__ 1

define __NO_MATH_INLINES 1

define __OBJC_BOOL_IS_BOOL 0

define __OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES 3

define __OPENCL_MEMORY_SCOPE_DEVICE 2

define __OPENCL_MEMORY_SCOPE_SUB_GROUP 4

define __OPENCL_MEMORY_SCOPE_WORK_GROUP 1

define __OPENCL_MEMORY_SCOPE_WORK_ITEM 0

define ORDER_BIG_ENDIAN 4321

define ORDER_LITTLE_ENDIAN 1234

define ORDER_PDP_ENDIAN 3412

define PIC 2

define PIE 2

define __POINTER_WIDTH__ 64

define __PRAGMA_REDEFINE_EXTNAME 1

define __PTRDIFF_FMTd__ "ld"

define __PTRDIFF_FMTi__ "li"

define __PTRDIFF_MAX__ 9223372036854775807L

define __PTRDIFF_TYPE__ long int

define __PTRDIFF_WIDTH__ 64

define __REGISTER_PREFIX__

define __SCHAR_MAX__ 127

define __SEG_FS 1

define __SEG_GS 1

define __SHRT_MAX__ 32767

define __SHRT_WIDTH__ 16

define SIG_ATOMIC_MAX 2147483647

define SIG_ATOMIC_WIDTH 32

define __SIZEOF_DOUBLE__ 8

define __SIZEOF_FLOAT128__ 16

define __SIZEOF_FLOAT__ 4

define __SIZEOF_INT128__ 16

define __SIZEOF_INT__ 4

define SIZEOF_LONG_DOUBLE 16

define SIZEOF_LONG_LONG 8

define __SIZEOF_LONG__ 8

define __SIZEOF_POINTER__ 8

define SIZEOF_PTRDIFF_T 8

define __SIZEOF_SHORT__ 2

define SIZEOF_SIZE_T 8

define SIZEOF_WCHAR_T 4

define SIZEOF_WINT_T 4

define __SIZE_FMTX__ "lX"

define __SIZE_FMTo__ "lo"

define __SIZE_FMTu__ "lu"

define __SIZE_FMTx__ "lx"

define __SIZE_MAX__ 18446744073709551615UL

define __SIZE_TYPE__ long unsigned int

define __SIZE_WIDTH__ 64

define __SSE2_MATH__ 1

define SSE2 1

define __SSE_MATH__ 1

define SSE 1

define __STDC_HOSTED__ 1

define STDC_UTF_16 1

define STDC_UTF_32 1

define __STDC_VERSION__ 201710L

define STDC 1

define UINT16_C_SUFFIX

define __UINT16_FMTX__ "hX"

define __UINT16_FMTo__ "ho"

define __UINT16_FMTu__ "hu"

define __UINT16_FMTx__ "hx"

define __UINT16_MAX__ 65535

define __UINT16_TYPE__ unsigned short

define UINT32_C_SUFFIX U

define __UINT32_FMTX__ "X"

define __UINT32_FMTo__ "o"

define __UINT32_FMTu__ "u"

define __UINT32_FMTx__ "x"

define __UINT32_MAX__ 4294967295U

define __UINT32_TYPE__ unsigned int

define UINT64_C_SUFFIX UL

define __UINT64_FMTX__ "lX"

define __UINT64_FMTo__ "lo"

define __UINT64_FMTu__ "lu"

define __UINT64_FMTx__ "lx"

define __UINT64_MAX__ 18446744073709551615UL

define __UINT64_TYPE__ long unsigned int

define UINT8_C_SUFFIX

define __UINT8_FMTX__ "hhX"

define __UINT8_FMTo__ "hho"

define __UINT8_FMTu__ "hhu"

define __UINT8_FMTx__ "hhx"

define __UINT8_MAX__ 255

define __UINT8_TYPE__ unsigned char

define UINTMAX_C_SUFFIX UL

define __UINTMAX_FMTX__ "lX"

define __UINTMAX_FMTo__ "lo"

define __UINTMAX_FMTu__ "lu"

define __UINTMAX_FMTx__ "lx"

define __UINTMAX_MAX__ 18446744073709551615UL

define __UINTMAX_TYPE__ long unsigned int

define __UINTMAX_WIDTH__ 64

define __UINTPTR_FMTX__ "lX"

define __UINTPTR_FMTo__ "lo"

define __UINTPTR_FMTu__ "lu"

define __UINTPTR_FMTx__ "lx"

define __UINTPTR_MAX__ 18446744073709551615UL

define __UINTPTR_TYPE__ long unsigned int

define __UINTPTR_WIDTH__ 64

define UINT_FAST16_FMTX "hX"

define UINT_FAST16_FMTo "ho"

define UINT_FAST16_FMTu "hu"

define UINT_FAST16_FMTx "hx"

define UINT_FAST16_MAX 65535

define UINT_FAST16_TYPE unsigned short

define UINT_FAST32_FMTX "X"

define UINT_FAST32_FMTo "o"

define UINT_FAST32_FMTu "u"

define UINT_FAST32_FMTx "x"

define UINT_FAST32_MAX 4294967295U

define UINT_FAST32_TYPE unsigned int

define UINT_FAST64_FMTX "lX"

define UINT_FAST64_FMTo "lo"

define UINT_FAST64_FMTu "lu"

define UINT_FAST64_FMTx "lx"

define UINT_FAST64_MAX 18446744073709551615UL

define UINT_FAST64_TYPE long unsigned int

define UINT_FAST8_FMTX "hhX"

define UINT_FAST8_FMTo "hho"

define UINT_FAST8_FMTu "hhu"

define UINT_FAST8_FMTx "hhx"

define UINT_FAST8_MAX 255

define UINT_FAST8_TYPE unsigned char

define UINT_LEAST16_FMTX "hX"

define UINT_LEAST16_FMTo "ho"

define UINT_LEAST16_FMTu "hu"

define UINT_LEAST16_FMTx "hx"

define UINT_LEAST16_MAX 65535

define UINT_LEAST16_TYPE unsigned short

define UINT_LEAST32_FMTX "X"

define UINT_LEAST32_FMTo "o"

define UINT_LEAST32_FMTu "u"

define UINT_LEAST32_FMTx "x"

define UINT_LEAST32_MAX 4294967295U

define UINT_LEAST32_TYPE unsigned int

define UINT_LEAST64_FMTX "lX"

define UINT_LEAST64_FMTo "lo"

define UINT_LEAST64_FMTu "lu"

define UINT_LEAST64_FMTx "lx"

define UINT_LEAST64_MAX 18446744073709551615UL

define UINT_LEAST64_TYPE long unsigned int

define UINT_LEAST8_FMTX "hhX"

define UINT_LEAST8_FMTo "hho"

define UINT_LEAST8_FMTu "hhu"

define UINT_LEAST8_FMTx "hhx"

define UINT_LEAST8_MAX 255

define UINT_LEAST8_TYPE unsigned char

define USER_LABEL_PREFIX

define VERSION "Clang 16.0.6"

define __WCHAR_MAX__ 2147483647

define __WCHAR_TYPE__ int

define __WCHAR_WIDTH__ 32

define __WINT_MAX__ 4294967295U

define __WINT_TYPE__ unsigned int

define __WINT_UNSIGNED__ 1

define __WINT_WIDTH__ 32

define __amd64 1

define amd64 1

define clang 1

define clang_literal_encoding "UTF-8"

define __clang_major__ 16

define __clang_minor__ 0

define __clang_patchlevel__ 6

define __clang_version__ "16.0.6 "

define __clang_wide_literal_encoding__ "UTF-32"

define code_model_small 1

define __gnu_linux__ 1

define __k8 1

define k8 1

define __linux 1

define linux 1

define llvm 1

define pic 2

define pie 2

define __seg_fs attribute((address_space(257)))

define __seg_gs attribute((address_space(256)))

define __tune_k8__ 1

define __unix 1

define unix 1

define __x86_64 1

define __x86_64__ 1

define linux 1

define unix 1

eyalroz commented 11 months ago

Ah, well, you were getting this warning because you weren't building it the way I suggested, which does have these warnings turned on. I can reproduce this now with just clang -I src/ -c src/printf/printf.c -o printf.o in the repository root dir.

Anyway, it can't hurt I guess, so - will accept this. Would have liked an issue filed first though.

eyalroz commented 11 months ago

Ah, well, this breaks the build:

[ 12%] Building C object CMakeFiles/printf.dir/src/printf/printf.c.o
/home/runner/work/printf/printf/src/printf/printf.c: In function ‘unapply_scaling’:
/home/runner/work/printf/printf/src/printf/printf.c:659:45: error: missing binary operator before token "("
  659 | #if !defined(__has_warning) || __has_warning("-Wmaybe-uninitialized")
      |                                             ^
/home/runner/work/printf/printf/src/printf/printf.c: In function ‘print_exponential_number’:
/home/runner/work/printf/printf/src/printf/printf.c:941:45: error: missing binary operator before token "("
  941 | #if !defined(__has_warning) || __has_warning("-Wmaybe-uninitialized")
      |                                             ^

so we have to try something more complex.

andrewvoznytsa commented 11 months ago

Then I'll look for something better.

eyalroz commented 11 months ago

Just look at what I've committed, i.e. pull the HEAD of develop. Tell me if that works for you.

andrewvoznytsa commented 11 months ago

Yes, that works perfectly - thank you!

eyalroz commented 11 months ago

... and I have now made a beta release of a new version with this and a few additional fixes.

andrewvoznytsa commented 11 months ago

:+1: Next time if I decide to submit something I'll start with an issue - finally managed to read your README ;-)