Closed andrewvoznytsa closed 11 months ago
I don't know that there's a maybe-uninitialized variable used in the code... where exactly?
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.
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?
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"
clang -v clang version 16.0.6 Target: x86_64-unknown-linux-gnu
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
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.
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.
Then I'll look for something better.
Just look at what I've committed, i.e. pull the HEAD of develop. Tell me if that works for you.
Yes, that works perfectly - thank you!
... and I have now made a beta release of a new version with this and a few additional fixes.
:+1: Next time if I decide to submit something I'll start with an issue - finally managed to read your README ;-)
This little tweak fixes clang's "unknown warning group -Wmaybe-uninitialized".