Hi! That mechanism is flawed anyway, since it appears to assume that the host is little-endian. The pointer cast is a strong indicator that something is wrong.
/Andreas On Mon, Aug 22, 2022 at 12:32 AM Antonio Borneo <borneo.anto...@gmail.com> wrote: > Thanks for the quick fixes for this build issue. > I have just merged them after some checking on gcc 12 and on MacOS. > > There are still two new scan-build issues not fixed by the patch > https://review.openocd.org/7137 > They are both triggered by command "xtensa exe" on big-endian target > when the command line argument of the command is not a multiple of 4 > bytes, e.g. "xtensa exe ff". > One warning is reported for the command line of one byte, the second > for 3 bytes. The same fix should work for both warnings. > > Trace for "xtensa exe ff": > xtensa_cmd_exe() > xtensa_cmd_exe_do() > here one byte 0xff is put in ops[], while set oplen=1 > xtensa_queue_exec_ins_wide(xtensa, ops, oplen); > 503: uint8_t oplenw = (oplen + 3) / 4; > now oplenw=1, but we don't have one word, we only have one byte. Then in > 505: buf_bswap32((uint8_t *)opsw, ops, oplenw * 4); > we try to swap 4 bytes, but three of them are uninitialized. Warning! > > I prefer you to fix the issue; I don't know if the command line must > have multiple of 4 bytes or even 1 byte is ok. > > Regards > Antonio > > On Sun, Aug 21, 2022 at 7:10 AM Ian Thompson <ia...@cadence.com> wrote: > > > > Thank you Erhan for submitting the fixes, and for Antonio for not > immediately backing out these patches. It sounds like both Erhan and I are > able to build now, him with gcc12 and me with gcc10. > > > > > > > > Going forward, what parts of the review flow did I miss so I can avoid > causing this trouble in the future? I should definitely have rerun static > analysis on a more recent patchset of 7055. Is upgrading my GCC required > also? > > > > > > > > Apologies for the trouble and thank you again @Erhan Kurubas for the > very timely fixes. > > > > > > > > Best, > > > > --ian > > > > > > > > > > > > From: Antonio Borneo <borneo.anto...@gmail.com> > > Sent: Saturday, August 20, 2022 12:27 PM > > To: Ian Thompson <ia...@cadence.com>; Erhan Kurubas < > erhan.kuru...@espressif.com> > > Cc: OpenOCD <OpenOCD-devel@lists.sourceforge.net> > > Subject: Re: Build error: target: add generic Xtensa LX support > > > > > > > > EXTERNAL MAIL > > > > Plus 5 new clang warnings > > > > https://build.openocd.org/job/openocd-clang/1106/ > > > > Actually 3 are surely from xtensa code. The other 2 are not clear. > > > > > > > > Antonio > > > > > > > > On Sat, Aug 20, 2022, 19:52 Antonio Borneo <borneo.anto...@gmail.com> > wrote: > > > > I have made the mistake to merge the patch > > https://review.openocd.org/c/openocd/+/7055 > > without pre-building it locally on my PC for test, which is what I > > usually do (but not today!). > > BOOM. > > Master branch does not compile anymore > > > > I tried to fix it, but I ended up with one issue! > > Could you please investigate and provide a patch asap? > > For the moment I prefer not reverting this and 7083. > > > > Analysis below. > > Antonio > > > > Compile errors with GCC 12.1.0 > > src/target/xtensa/xtensa.c: In function 'xtensa_target_init': > > src/target/xtensa/xtensa.c:2471:65: error: '%04x' directive writing > > between 4 and 8 bytes into a region of size 5 > > [-Werror=format-overflow=] > > 2471 | sprintf((char *)xtensa->empty_regs[i].name, > > "?0x%04x", i); > > | > ^~~~ > > In function 'xtensa_build_reg_cache', > > inlined from 'xtensa_target_init' at > src/target/xtensa/xtensa.c:2899:9: > > src/target/xtensa/xtensa.c:2471:61: note: directive argument in the > > range [0, 4294967294] > > 2471 | sprintf((char *)xtensa->empty_regs[i].name, > > "?0x%04x", i); > > | > ^~~~~~~~~ > > src/target/xtensa/xtensa.c:2471:17: note: 'sprintf' output between 8 > > and 12 bytes into a destination of size 8 > > 2471 | sprintf((char *)xtensa->empty_regs[i].name, > > "?0x%04x", i); > > | > > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > > > This can be easily fixed adding a mask > > - sprintf((char *)xtensa->empty_regs[i].name, "?0x%04x", i); > > + sprintf((char *)xtensa->empty_regs[i].name, "?0x%04x", i & 0x0000ffff); > > > > > > Still GCC 12.1.0 > > In file included from src/target/xtensa/xtensa_chip.h:12, > > from src/target/xtensa/xtensa.c:20: > > In function 'xtensa_queue_dbg_reg_write', > > inlined from 'xtensa_write_dirty_registers' at > > src/target/xtensa/xtensa.c:758:3: > > src/target/xtensa/xtensa.h:297:16: error: 'a3' may be used > > uninitialized [-Werror=maybe-uninitialized] > > 297 | return dm->dbg_ops->queue_reg_write(dm, reg, data); > > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > src/target/xtensa/xtensa.c: In function 'xtensa_write_dirty_registers': > > src/target/xtensa/xtensa.c:594:26: note: 'a3' was declared here > > 594 | xtensa_reg_val_t a3, woe; > > | ^~ > > > > Here looks that GCC is dumb and fails to detect that 'preserve_a3' is > > not changed. > > Initializing a3=0 is a good workaround > > - xtensa_reg_val_t a3, woe; > > + xtensa_reg_val_t a3 = 0, woe; > > > > > > Then, on MacOS CLANG, looks like enum are considered as unsigned int > > (which surprises me, while GCC consider them as signed) > > src/target/xtensa/xtensa.c:2850:51: error: comparison of unsigned enum > > expression >= 0 is always true [-Werror,-Wtautological-compare] > > for (enum xtensa_ar_scratch_set_e f = s - 1; > > s >= 0; s--) > > ~ > ^ ~ > > But here the code is broken! > > 2850: for (enum xtensa_ar_scratch_set_e f = s - 1; s >= 0; s--) > > 2851: free(xtensa->scratch_ars[f].chrval); > > the variable f does not change in the loop, so you free the same area > > 's' times. Here valgrind should scream loudly. > > You report valgrind-clean in the commit message; probably the > > execution flow never passed through this code. > > Is fix below ok? > > - for (enum xtensa_ar_scratch_set_e f = s - 1; s >= 0; s--) > > + for (enum xtensa_ar_scratch_set_e f = 0; f < s; f++) > >