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

[PATCH/RFC] reflog: silence -O3 -Wuninitialized warning

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Mar 16, 2011, 02:49 UTC
Message-ID
<20110316024959.GA24932@elie>
Date: Fri, 04 Mar 2011 00:54:53 -0600

Starting with gcc 4.5 (r147852, Pretty-ipa merge: Inliner heruistics reorg, 2009-05-25), gcc -O3 -Wall warns when building reflog_expire_config:

    warning: 'expire' may be used uninitialized in this function [-Wuninitialized]

The cause: starting with that version, gcc realizes it can inline the call to parse_expire_cfg_value. In the error case, 'expire' is not initialized and the function returns early, but gcc does not have enough information to figure out that this is an error return.

Squash the warning by letting the optimizer peek at the return value from config_error_nonbool. This also decreases the text size by a tiny (negligible) amount when building with -Os --- before:

    text    data     bss     dec     hex filename
 1002184   24856  316928 1343968  1481e0 git
After:
    text    data     bss     dec     hex filename
 1002120   24856  316928 1343904  1481a0 git
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Hi,

Another patch that was sitting around in my tree. (I had the somewhat insane idea of turning on as many warnings as feasible and getting git to build with -Werror. The effect on running time for tests was encouraging but within noise.)

While it might make sense to do something like this for error() itself, I don't know a clean and portable way to make a variadic macro or inline function.

Anyway, maybe this can provide some amusement.
 cache.h  |    8 +++++++-
 config.c |    4 ++--
 2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/cache.h b/cache.h
index c4ef999..c8ce53a 100644
--- a/cache.h
+++ b/cache.h
@@ -1022,10 +1022,16 @@ extern int check_repository_format_version(const char *var, const char *value, v
 extern int git_env_bool(const char *, int);
 extern int git_config_system(void);
 extern int git_config_global(void);
-extern int config_error_nonbool(const char *);
 extern const char *get_log_output_encoding(void);
 extern const char *get_commit_output_encoding(void);
 
+extern void config_print_error_nonbool(const char *);
+static inline int config_error_nonbool(const char *var)
+{
+	config_print_error_nonbool(var);
+	return -1;
+}
+
 extern const char *config_exclusive_filename;
 
 #define MAX_GITNAME (1000)
diff --git a/config.c b/config.c
index b94de8f..cf41c1c 100644
--- a/config.c
+++ b/config.c
@@ -1506,7 +1506,7 @@ int git_config_rename_section(const char *old_name, const char *new_name)
  * Call this to report error for your variable that should not
  * get a boolean value (i.e. "[my] var" means "true").
  */
-int config_error_nonbool(const char *var)
+void config_print_error_nonbool(const char *var)
 {
-	return error("Missing value for '%s'", var);
+	error("Missing value for '%s'", var);
 }
-- 
1.7.4.1
Next: Jonathan Nieder
Message 1 of 34 in “reflog: silence -O3 -Wuninitialized warning”
  1. reflog: silence -O3 -Wuninitialized warningJonathan Nieder, Mar 16, 2011
  2. declare 1-bit bitfields to be unsignedJonathan Nieder, Mar 16, 2011
  3. Junio C HamanoMar 16, 2011
  4. Nguyen Thai Ngoc DuyMar 16, 2011
  5. Junio C HamanoMar 16, 2011
  6. Jonathan NiederMar 16, 2011
  7. Johannes SixtMar 16, 2011
  8. Jonathan NiederMar 16, 2011
  9. Johannes SixtMar 16, 2011
  10. Jonathan NiederMar 16, 2011
  11. 0/6 silence -Wuninitialized warnings that previously used the a = a trickJonathan Nieder, Mar 16, 2011
  12. 1/6 match-trees: kill off remaining -Wuninitialized warningJonathan Nieder, Mar 16, 2011
  13. 2/6 run-command: initialize failed_errno to 0Jonathan Nieder, Mar 16, 2011
  14. 3/6 diff --submodule: suppress -Wuninitialized warning by initializing to NULLJonathan Nieder, Mar 16, 2011
  15. 4/6 rsync transport: clarify insert_packed_refsJonathan Nieder, Mar 16, 2011
  16. 5/6 wt-status: protect against invalid change_typeJonathan Nieder, Mar 16, 2011
  17. 6/6 fast-import: suppress -Wuninitialized warning by initializing to NULLJonathan Nieder, Mar 16, 2011
  18. 0/8 more warnings and cleanupsJonathan Nieder, Mar 16, 2011
  19. 1/8 enums: omit trailing comma for portabilityJonathan Nieder, Mar 16, 2011
  20. 2/8 compat: make gcc bswap an inline functionJonathan Nieder, Mar 16, 2011
  21. Johannes SixtMar 16, 2011
  22. Jonathan NiederMar 16, 2011
  23. Junio C HamanoMar 16, 2011
  24. 3/8 svn-fe: do not use "return" for tail call returning voidJonathan Nieder, Mar 16, 2011
  25. 4/8 vcs-svn: remove spurious semicolonsJonathan Nieder, Mar 16, 2011
  26. Junio C HamanoMar 16, 2011
  27. Jonathan NiederMar 16, 2011
  28. 5/8 standardize brace placement in struct definitionsJonathan Nieder, Mar 16, 2011
  29. Junio C HamanoMar 18, 2011
  30. 6/8 branch: split off function that writes tracking info and commit subjectJonathan Nieder, Mar 16, 2011
  31. 7/8 cherry: split off function to print output linesJonathan Nieder, Mar 16, 2011
  32. 8/8 diff --submodule: split into bite-sized piecesJonathan Nieder, Mar 16, 2011
  33. Jens LehmannMar 16, 2011
  34. Jonathan NiederMar 16, 2011

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.