git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 2/4] compat/regex: include alloca.h before undef it

From
Ramsay Jones <ramsay@ramsayjones.plus.com>
Date
Apr 25, 2020, 20:28 UTC
Message-ID
<ffcaaf4f-a43f-2d20-b70d-dfb8b1d7c687@ramsayjones.plus.com>
In-Reply-To
<20200424223440.GC721@danh.dev>

On 24/04/2020 23:34, Danh Doan wrote: [snip]

Show 12 quoted lines
> OK, I've tried with my glibc box, it doesn't have that warning.
> On musl, it warns:
> 
> 	$ make compat/regex/regex.sp
> 	GIT_VERSION = 2.26.2
> 	    * new build flags
> 	    SP compat/regex/regex.c
> 	/usr/include/alloca.h:14:9: warning: preprocessor token alloca redefined
> 	compat/regex/regex.c:66:9: this was the original definition
> 	compat/regex/regex_internal.c:925:1: error: symbol 're_string_context_at' redeclared with different type (originally declared at compat/regex/regex_internal.h:433) - different modifiers
> 
> 

OK, I had a quick look at the <alloca.h> header file on a glibc system (linux) and new-lib system (cygwin) and they both do (more or less) the same thing: first #undef alloca, and then if being compiled by gcc, define alloca(size) to be __builtin_alloca(size).

So, even if <alloca.h> is #included after regex.c:66, it wouldn't be a problem. Since I don't have access to a musl based system, I don't know what that system header is doing.

However, I said *even if* above, because I don't see why it is trying to #include <alloca.h> in the first place! ;-)

Note that the three calls to alloca in compat/regex:
  $ git grep -n '\<alloca\>' -- compat/regex
  compat/regex/regex.c:65:#undef alloca
  compat/regex/regex.c:66:#define alloca alloca_is_bad_you_should_never_use_it
  compat/regex/regex_internal.h:460:#   include <alloca.h>
  compat/regex/regex_internal.h:468:/* alloca is implemented with malloc, so just use malloc.  */
  compat/regex/regexec.c:1428:    prev_idx_match = (regmatch_t *) alloca (nmatch * sizeof (regmatch_t));
  compat/regex/regexec.c:3338:    dests_alloc = (struct dests_alloc *) alloca (sizeof (struct dests_alloc));
  compat/regex/regexec.c:3385:      alloca (ndests * 3 * sizeof (re_dfastate_t *));
  $ 

... in compat/regex/regexec.c are all protected by '#ifdef HAVE_ALLOCA', as indeed is the #include of the header file in compat/regex/regex_internal.h at line 460. Since HAVE_ALLOCA should not be defined, where is that file being included?

Note that HAVE_ALLOCA
 
  $ git grep -n HAVE_ALLOCA -- compat
  compat/regex/regex_internal.h:455:# if HAVE_ALLOCA
  compat/regex/regexec.c:1426:#ifdef HAVE_ALLOCA
  compat/regex/regexec.c:3336:#ifdef HAVE_ALLOCA
  compat/regex/regexec.c:3381:#ifdef HAVE_ALLOCA
  $ 
... is not the same as HAVE_ALLOCA_H
  $ git grep -n HAVE_ALLOCA
  Makefile:45:# Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
  Makefile:1349:ifdef HAVE_ALLOCA_H
  Makefile:1350:  BASIC_CFLAGS += -DHAVE_ALLOCA_H
  compat/regex/regex_internal.h:455:# if HAVE_ALLOCA
  compat/regex/regexec.c:1426:#ifdef HAVE_ALLOCA
  compat/regex/regexec.c:3336:#ifdef HAVE_ALLOCA
  compat/regex/regexec.c:3381:#ifdef HAVE_ALLOCA
  config.mak.uname:47:    HAVE_ALLOCA_H = YesPlease
  config.mak.uname:63:    HAVE_ALLOCA_H = YesPlease
  config.mak.uname:147:   HAVE_ALLOCA_H = YesPlease
  config.mak.uname:206:   HAVE_ALLOCA_H = YesPlease
  config.mak.uname:310:   HAVE_ALLOCA_H = YesPlease
  config.mak.uname:395:   HAVE_ALLOCA_H = YesPlease
  config.mak.uname:586:   HAVE_ALLOCA_H = YesPlease
  configure.ac:320:# Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
  configure.ac:323:    yes)    HAVE_ALLOCA_H=YesPlease;;
  configure.ac:324:    *)      HAVE_ALLOCA_H='';;
  configure.ac:326:GIT_CONF_SUBST([HAVE_ALLOCA_H])
  git-compat-util.h:840:#ifdef HAVE_ALLOCA_H
  $ 
... used by the rest of git, outside of the compat/regex directory.
Once again, you can see that HAVE_ALLOCA
  $ make V=1 NO_REGEX=1 compat/regex/regex.sp
  cgcc -no-compile -Werror -Wall -Wdeclaration-after-statement -Wformat-security -Wold-style-definition -Woverflow -Wpointer-arith -Wstrict-prototypes -Wunused -Wvla -DENABLE_SHA256 -Wextra -Wmissing-prototypes -Wno-empty-body -Wno-missing-field-initializers -Wno-sign-compare -Wno-unused-parameter  -g -O2 -Wall -I. -DHAVE_SYSINFO -DGIT_HOST_CPU="\"x86_64\"" -DHAVE_ALLOCA_H  -DUSE_CURL_FOR_IMAP_SEND -DSHA1_DC -DSHA1DC_NO_STANDARD_INCLUDES -DSHA1DC_INIT_SAFE_HASH_DEFAULT=0 -DSHA1DC_CUSTOM_INCLUDE_SHA1_C="\"cache.h\"" -DSHA1DC_CUSTOM_INCLUDE_UBC_CHECK_C="\"git-compat-util.h\"" -DSHA256_BLK  -DHAVE_PATHS_H -DHAVE_DEV_TTY -DHAVE_CLOCK_GETTIME -DHAVE_CLOCK_MONOTONIC -DHAVE_GETDELIM '-DPROCFS_EXECUTABLE_PATH="/proc/self/exe"'  -DFREAD_READS_DIRECTORIES -DNO_STRLCPY -Icompat/regex -DSHELL_PATH='"/bin/sh"' -DPAGER_ENV='"LESS=FRX LV=-c"' -DGAWK -DNO_MBSUPPORT \
  	  compat/regex/regex.c
  $ 
  
... is not being set on the command-line.

Hmm, do you have this set in config.mak, config.mak.autogen, or some other source? puzzled! ;-)

BTW, why are you compiling with NO_REGEX set anyway?

ATB, Ramsay Jones

Previous: Danh DoanNext: Danh Doan
Message 27 of 51 in “fix make sparse warning”
  1. 0/4 fix make sparse warningĐoàn Trần Công Danh, Apr 23, 2020
  2. 1/4 C: s/0/NULL/ for pointer typeĐoàn Trần Công Danh, Apr 23, 2020
  3. Ramsay JonesApr 24, 2020
  4. Junio C HamanoApr 24, 2020
  5. Danh DoanApr 24, 2020
  6. Junio C HamanoApr 24, 2020
  7. Luc Van OostenryckMay 14, 2020
  8. 2/4 compat/regex: silence `make sparse` warningĐoàn Trần Công Danh, Apr 23, 2020
  9. Ramsay JonesApr 24, 2020
  10. Danh DoanApr 24, 2020
  11. 3/4 graph.c: limit linkage of internal variableĐoàn Trần Công Danh, Apr 23, 2020
  12. Ramsay JonesApr 24, 2020
  13. 4/4 progress.c: silence cgcc suggestion about internal linkageĐoàn Trần Công Danh, Apr 23, 2020
  14. Ramsay JonesApr 24, 2020
  15. Jeff KingApr 24, 2020
  16. 5/4 fmt-merge-msg.c: fix `make sparse` on nextĐoàn Trần Công Danh, Apr 23, 2020
  17. Ramsay JonesApr 23, 2020
  18. Danh DoanApr 23, 2020
  19. Ramsay JonesApr 24, 2020
  20. 0/4 Fix Sparse WarningĐoàn Trần Công Danh, Apr 24, 2020
  21. 1/4 test-parse-pathspec-file.c: s/0/NULL/ for pointer typeĐoàn Trần Công Danh, Apr 24, 2020
  22. 2/4 compat/regex: include alloca.h before undef itĐoàn Trần Công Danh, Apr 24, 2020
  23. Ramsay JonesApr 24, 2020
  24. Danh DoanApr 24, 2020
  25. Ramsay JonesApr 24, 2020
  26. Danh DoanApr 24, 2020
  27. Ramsay JonesApr 25, 2020
  28. Danh DoanApr 26, 2020
  29. Danh DoanApr 26, 2020
  30. Ramsay JonesApr 26, 2020
  31. Ramsay JonesApr 26, 2020
  32. Junio C HamanoApr 26, 2020
  33. Danh DoanApr 27, 2020
  34. Ramsay JonesApr 27, 2020
  35. Danh DoanApr 27, 2020
  36. Ramsay JonesApr 27, 2020
  37. 3/4 graph.c: limit linkage of internal variableĐoàn Trần Công Danh, Apr 24, 2020
  38. 4/4 progress.c: silence cgcc suggestion about internal linkageĐoàn Trần Công Danh, Apr 24, 2020
  39. Ramsay JonesApr 24, 2020
  40. Johannes SchindelinApr 25, 2020
  41. Danh DoanApr 26, 2020
  42. Ramsay JonesApr 26, 2020
  43. Johannes SchindelinMay 1, 2020
  44. 0/4 Partial fix `make sparse`Đoàn Trần Công Danh, Apr 27, 2020
  45. 1/4 test-parse-pathspec-file.c: s/0/NULL/ for pointer typeĐoàn Trần Công Danh, Apr 27, 2020
  46. 2/4 compat/regex: move stdlib.h up in inclusion chainĐoàn Trần Công Danh, Apr 27, 2020
  47. Ramsay JonesApr 27, 2020
  48. 3/4 graph.c: limit linkage of internal variableĐoàn Trần Công Danh, Apr 27, 2020
  49. 4/4 progress.c: silence cgcc suggestion about internal linkageĐoàn Trần Công Danh, Apr 27, 2020
  50. Johannes SchindelinMay 1, 2020
  51. Ramsay JonesApr 27, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.