This is _really_ weird. I'm seeing what looks (to me) to be a bug in arm-none-eabig-gcc where it _may_ generate format warnings (or not) when run over functionally equivalent source using same compilation options.

I'm trying to understand why a syslog call using a format of "%08x" and an argument of uint32_t doesn't cause a format warning when built using arm-none-eabi-gcc (version 13.2.1 20231009) on my Ubuntu machine.

I configured nuttx for nucelo-h743zi2:jumbo, tweaked the configuration to enable DEBUG_IRQ_INFO, and built with V=1 to get the compiler command line for arch/arm/src/chip/stm32_irq.c:

tools/configure.sh -l nucleo-h743zi2jumbo
kconfig-tweak --file .config -e DEBUG_IRQ_INFO
make V=1 -j $(nproc)

Then chdir into arch/arm/src and generate preprocessed source of chip/stm32_irq.c into /tmp/stm32_irq.c using the complication command from the build:

cd arch/arm/src
# setup BASE_DIR to root of nuttx tree
BASE_DIR=/home/peter/git/nuttx/github/nucleo-h743zi2-warnings/nuttx
# setup COMPILER_OPTIONS for what gets passed to gcc
COMPILER_OPTIONS="-Wstrict-prototypes -Wno-attributes -Wno-unknown-pragmas" \
 " -Wno-psabi -Os -fno-strict-aliasing -fomit-frame-pointer" \
 " --param=min-pagesize=0 -fno-common -Wall -Wshadow -Wundef" \
 " -ffunction-sections -fdata-sections "-g" -mlittle-endian" \
 " -march=armv7e-m -mtune=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard" \
 " -mthumb -Wa,-mthumb -Wa,-mimplicit-it=always -isystem"

# Generate /tmp/stm32_irq.c from chip/stm32_irq.c
arm-none-eabi-gcc -E $COMPILER_OPTIONS $BASE_DIR/include -D__NuttX__ \
    -DNDEBUG -D__KERNEL__  -I $BASE_DIR/arch/arm/src/chip \
    -I $BASE_DIR/arch/arm/src/common -I $BASE_DIR/arch/arm/src/armv7-m \
    -I $BASE_DIR/sched    chip/stm32_irq.c -o  /tmp/stm32_irq.c

# Compile the result file using same compiler options:
arm-none-eabi-gcc -E $COMPILER_OPTIONS $BASE_DIR/include -D__NuttX__ \
    -DNDEBUG -D__KERNEL__  -I $BASE_DIR/arch/arm/src/chip \
    -I $BASE_DIR/arch/arm/src/common -I $BASE_DIR/arch/arm/src/armv7-m \
    -I $BASE_DIR/sched    chip/stm32_irq.c -o  /tmp/stm32_irq.c

# So far no errors (yes, get a preprocessow warning, can ignore)

The above should just generate a preprofcessing warning.  Now it gets strange:

# Remove _all_ the preprocessor generated linemarkers and compile again:
sed -ie '/^#/d' /tmp/stm32_irq.c

arm-none-eabi-gcc -E $COMPILER_OPTIONS $BASE_DIR/include -D__NuttX__ \
    -DNDEBUG -D__KERNEL__  -I $BASE_DIR/arch/arm/src/chip \
    -I $BASE_DIR/arch/arm/src/common -I $BASE_DIR/arch/arm/src/armv7-m \
    -I $BASE_DIR/sched    chip/stm32_irq.c -o  /tmp/stm32_irq.c

And now I see format warnings (here's the first):

/tmp/stm32_irq.c: In function 'stm32_dumpnvic':

/tmp/stm32_irq.c:4875:12: warning: format '%x' expects argument of type 
'unsigned int', but argument 4 has type 'uint32_t' {aka 'long unsigned int'} 
[-Wformat=]
 4875 |  syslog(6, "%s: "
      |            ^~~~~~
......
 4878 |  getreg32((0xe000e000 + 0x0d04)), getreg32((0xe000e000 + 0x0d08))
      |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |  |
      |  uint32_t {aka long unsigned int}
/tmp/stm32_irq.c:4876:20: note: format string is defined here
 4876 |  "  INTCTRL:    %08x VECTAB:  %08x\n"
      |                 ~~~^
      |                    |
      |                    unsigned int
      |                 %08lx

Could someone who builds stm32 on Ubuntu try out above commands (changing BASE_DIR to match your tree) and tell me if you see same results where format warnings magically appear?  Any ideas why gcc generates format warnings over same source - only after removing all the preprocessor linemarkers?

Thanks in advance!

--
Peter Barada
[email protected]

Reply via email to