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

[PATCH 10/10] hashmap_for_each_entry(): work around MSVC's run-time check failure #3

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Sep 25, 2020, 14:28 UTC
Message-ID
<dc46d39611df4ebd90d9308364d887e638c1bc30.1601044119.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.738.git.1601044118.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>

When compiling Git in Visual C, we do not have the luxury of support for `typeof()`, and therefore `OFFSETOF_VAR()` unfortunately has to fall back to pointer arithmetic.

When compiling code using the `hashmap_for_each_entry()` macro in Debug mode, this leads to the "run-time check failure #3" because the variable passed as `var` are not initialized, yet we calculate the pointer difference `&(var->member)-var`.

This "run-time check failure" causes a scary dialog to pop up.
Work around this by initializing the respective variables.
Note: according to the C standard, performing pointer arithmetic
with `NULL` is not exactly well-defined, but it seems to work
here, and it is at least better than performing pointer arithmetic
with an uninitialized pointer.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 attr.c                              |  2 +-
 blame.c                             |  4 ++--
 bloom.c                             |  2 +-
 builtin/describe.c                  |  2 +-
 builtin/difftool.c                  |  2 +-
 builtin/fast-import.c               |  2 +-
 builtin/sparse-checkout.c           |  6 +++---
 config.c                            |  2 +-
 merge-recursive.c                   | 10 +++++-----
 name-hash.c                         |  2 +-
 revision.c                          |  4 ++--
 submodule-config.c                  |  2 +-
 t/helper/test-hashmap.c             |  2 +-
 t/helper/test-lazy-init-name-hash.c |  4 ++--
 14 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/attr.c b/attr.c
index a826b2ef1f..b4fde37877 100644
--- a/attr.c
+++ b/attr.c
@@ -160,7 +160,7 @@ static void all_attrs_init(struct attr_hashmap *map, struct attr_check *check)
 	 * field and fill each entry with its corresponding git_attr.
 	 */
 	if (size != check->all_attrs_nr) {
-		struct attr_hash_entry *e;
+		struct attr_hash_entry *e = NULL;
 		struct hashmap_iter iter;
 
 		REALLOC_ARRAY(check->all_attrs, size);
diff --git a/blame.c b/blame.c
index b475bfa1c0..e9879a772e 100644
--- a/blame.c
+++ b/blame.c
@@ -450,7 +450,7 @@ static int fingerprint_similarity(struct fingerprint *a, struct fingerprint *b)
 {
 	int intersection = 0;
 	struct hashmap_iter iter;
-	const struct fingerprint_entry *entry_a, *entry_b;
+	const struct fingerprint_entry *entry_a, *entry_b = NULL;
 
 	hashmap_for_each_entry(&b->map, &iter, entry_b,
 				entry /* member name */) {
@@ -469,7 +469,7 @@ static void fingerprint_subtract(struct fingerprint *a, struct fingerprint *b)
 {
 	struct hashmap_iter iter;
 	struct fingerprint_entry *entry_a;
-	const struct fingerprint_entry *entry_b;
+	const struct fingerprint_entry *entry_b = NULL;
 
 	hashmap_iter_init(&b->map, &iter);
 
diff --git a/bloom.c b/bloom.c
index 1a573226e7..ee45e9ccce 100644
--- a/bloom.c
+++ b/bloom.c
@@ -221,7 +221,7 @@ struct bloom_filter *get_bloom_filter(struct repository *r,
 
 	if (diffopt.num_changes <= max_changes) {
 		struct hashmap pathmap;
-		struct pathmap_hash_entry *e;
+		struct pathmap_hash_entry *e = NULL;
 		struct hashmap_iter iter;
 		hashmap_init(&pathmap, pathmap_cmp, NULL, 0);
 
diff --git a/builtin/describe.c b/builtin/describe.c
index 7668591d57..8b281cf426 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -332,7 +332,7 @@ static void describe_commit(struct object_id *oid, struct strbuf *dst)
 	if (!have_util) {
 		struct hashmap_iter iter;
 		struct commit *c;
-		struct commit_name *n;
+		struct commit_name *n = NULL;
 
 		init_commit_names(&commit_names);
 		hashmap_for_each_entry(&names, &iter, n,
diff --git a/builtin/difftool.c b/builtin/difftool.c
index 7ac432b881..a1527ea01c 100644
--- a/builtin/difftool.c
+++ b/builtin/difftool.c
@@ -344,7 +344,7 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
 	FILE *fp;
 	struct hashmap working_tree_dups, submodules, symlinks2;
 	struct hashmap_iter iter;
-	struct pair_entry *entry;
+	struct pair_entry *entry = NULL;
 	struct index_state wtindex;
 	struct checkout lstate, rstate;
 	int rc, flags = RUN_GIT_CMD, err = 0;
diff --git a/builtin/fast-import.c b/builtin/fast-import.c
index 1bf50a73dc..72154383c3 100644
--- a/builtin/fast-import.c
+++ b/builtin/fast-import.c
@@ -498,7 +498,7 @@ static void invalidate_pack_id(unsigned int id)
 	unsigned long lu;
 	struct tag *t;
 	struct hashmap_iter iter;
-	struct object_entry *e;
+	struct object_entry *e = NULL;
 
 	hashmap_for_each_entry(&object_table, &iter, e, ent) {
 		if (e->pack_id == id)
diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c
index 4003f4d13a..fcd87da036 100644
--- a/builtin/sparse-checkout.c
+++ b/builtin/sparse-checkout.c
@@ -67,7 +67,7 @@ static int sparse_checkout_list(int argc, const char **argv)
 
 	if (pl.use_cone_patterns) {
 		int i;
-		struct pattern_entry *pe;
+		struct pattern_entry *pe = NULL;
 		struct hashmap_iter iter;
 		struct string_list sl = STRING_LIST_INIT_DUP;
 
@@ -153,7 +153,7 @@ static char *escaped_pattern(char *pattern)
 static void write_cone_to_file(FILE *fp, struct pattern_list *pl)
 {
 	int i;
-	struct pattern_entry *pe;
+	struct pattern_entry *pe = NULL;
 	struct hashmap_iter iter;
 	struct string_list sl = STRING_LIST_INIT_DUP;
 	struct strbuf parent_pattern = STRBUF_INIT;
@@ -465,7 +465,7 @@ static void add_patterns_cone_mode(int argc, const char **argv,
 				   struct pattern_list *pl)
 {
 	struct strbuf buffer = STRBUF_INIT;
-	struct pattern_entry *pe;
+	struct pattern_entry *pe = NULL;
 	struct hashmap_iter iter;
 	struct pattern_list existing;
 	char *sparse_filename = get_sparse_checkout_filename();
diff --git a/config.c b/config.c
index 2bdff4457b..83c72dd6e6 100644
--- a/config.c
+++ b/config.c
@@ -1953,7 +1953,7 @@ void git_configset_init(struct config_set *cs)
 
 void git_configset_clear(struct config_set *cs)
 {
-	struct config_set_element *entry;
+	struct config_set_element *entry = NULL;
 	struct hashmap_iter iter;
 	if (!cs->hash_initialized)
 		return;
diff --git a/merge-recursive.c b/merge-recursive.c
index d0214335a7..11ea550b0d 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -2151,8 +2151,8 @@ static void handle_directory_level_conflicts(struct merge_options *opt,
 					     struct tree *merge)
 {
 	struct hashmap_iter iter;
-	struct dir_rename_entry *head_ent;
-	struct dir_rename_entry *merge_ent;
+	struct dir_rename_entry *head_ent = NULL;
+	struct dir_rename_entry *merge_ent = NULL;
 
 	struct string_list remove_from_head = STRING_LIST_INIT_NODUP;
 	struct string_list remove_from_merge = STRING_LIST_INIT_NODUP;
@@ -2221,7 +2221,7 @@ static struct hashmap *get_directory_renames(struct diff_queue_struct *pairs)
 {
 	struct hashmap *dir_renames;
 	struct hashmap_iter iter;
-	struct dir_rename_entry *entry;
+	struct dir_rename_entry *entry = NULL;
 	int i;
 
 	/*
@@ -2590,7 +2590,7 @@ static struct string_list *get_renames(struct merge_options *opt,
 	int i;
 	struct hashmap collisions;
 	struct hashmap_iter iter;
-	struct collision_entry *e;
+	struct collision_entry *e = NULL;
 	struct string_list *renames;
 
 	compute_collisions(&collisions, dir_renames, pairs);
@@ -2862,7 +2862,7 @@ static void initial_cleanup_rename(struct diff_queue_struct *pairs,
 				   struct hashmap *dir_renames)
 {
 	struct hashmap_iter iter;
-	struct dir_rename_entry *e;
+	struct dir_rename_entry *e = NULL;
 
 	hashmap_for_each_entry(dir_renames, &iter, e,
 				ent /* member name */) {
diff --git a/name-hash.c b/name-hash.c
index fb526a3775..a3f710b2f8 100644
--- a/name-hash.c
+++ b/name-hash.c
@@ -706,7 +706,7 @@ void adjust_dirname_case(struct index_state *istate, char *name)
 
 struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int icase)
 {
-	struct cache_entry *ce;
+	struct cache_entry *ce = NULL;
 	unsigned int hash = memihash(name, namelen);
 
 	lazy_init_name_hash(istate);
diff --git a/revision.c b/revision.c
index 067030e64c..232de3f6f5 100644
--- a/revision.c
+++ b/revision.c
@@ -132,7 +132,7 @@ static void paths_and_oids_init(struct hashmap *map)
 static void paths_and_oids_clear(struct hashmap *map)
 {
 	struct hashmap_iter iter;
-	struct path_and_oids_entry *entry;
+	struct path_and_oids_entry *entry = NULL;
 
 	hashmap_for_each_entry(map, &iter, entry, ent /* member name */) {
 		oidset_clear(&entry->trees);
@@ -215,7 +215,7 @@ void mark_trees_uninteresting_sparse(struct repository *r,
 	unsigned has_interesting = 0, has_uninteresting = 0;
 	struct hashmap map;
 	struct hashmap_iter map_iter;
-	struct path_and_oids_entry *entry;
+	struct path_and_oids_entry *entry = NULL;
 	struct object_id *oid;
 	struct oidset_iter iter;
 
diff --git a/submodule-config.c b/submodule-config.c
index c569e22aa3..662b9d9c09 100644
--- a/submodule-config.c
+++ b/submodule-config.c
@@ -89,7 +89,7 @@ static void free_one_config(struct submodule_entry *entry)
 static void submodule_cache_clear(struct submodule_cache *cache)
 {
 	struct hashmap_iter iter;
-	struct submodule_entry *entry;
+	struct submodule_entry *entry = NULL;
 
 	if (!cache->initialized)
 		return;
diff --git a/t/helper/test-hashmap.c b/t/helper/test-hashmap.c
index f38706216f..2bde90309b 100644
--- a/t/helper/test-hashmap.c
+++ b/t/helper/test-hashmap.c
@@ -162,7 +162,7 @@ int cmd__hashmap(int argc, const char **argv)
 	while (strbuf_getline(&line, stdin) != EOF) {
 		char *cmd, *p1 = NULL, *p2 = NULL;
 		unsigned int hash = 0;
-		struct test_entry *entry;
+		struct test_entry *entry = NULL;
 
 		/* break line into command and up to two parameters */
 		cmd = strtok(line.buf, DELIM);
diff --git a/t/helper/test-lazy-init-name-hash.c b/t/helper/test-lazy-init-name-hash.c
index cd1b4c9736..2cb1fa3d8c 100644
--- a/t/helper/test-lazy-init-name-hash.c
+++ b/t/helper/test-lazy-init-name-hash.c
@@ -29,8 +29,8 @@ static void dump_run(void)
 		char name[FLEX_ARRAY];
 	};
 
-	struct dir_entry *dir;
-	struct cache_entry *ce;
+	struct dir_entry *dir = NULL;
+	struct cache_entry *ce = NULL;
 
 	read_cache();
 	if (single) {
-- 
gitgitgadget
Previous: Johannes SchindelinNext: Junio C Hamano
Message 24 of 70 in “CMake and Visual Studio”
  1. 00/10 CMake and Visual StudioJohannes Schindelin via GitGitGadget, Sep 25, 2020
  2. 01/10 cmake: ignore files generated by CMake as run in Visual StudioJohannes Schindelin via GitGitGadget, Sep 25, 2020
  3. 02/10 cmake: do find Git for Windows' shell interpreterJohannes Schindelin via GitGitGadget, Sep 25, 2020
  4. Sibi SiddharthanSep 25, 2020
  5. Johannes SchindelinSep 26, 2020
  6. Đoàn Trần Công DanhSep 27, 2020
  7. Johannes SchindelinSep 28, 2020
  8. Đoàn Trần Công DanhSep 29, 2020
  9. Johannes SchindelinSep 29, 2020
  10. 03/10 cmake: ensure that the `vcpkg` packages are found on WindowsJohannes Schindelin via GitGitGadget, Sep 25, 2020
  11. 07/10 cmake (Windows): complain when encountering an unknown compilerJohannes Schindelin via GitGitGadget, Sep 25, 2020
  12. Sibi SiddharthanSep 25, 2020
  13. Johannes SchindelinSep 26, 2020
  14. 06/10 cmake (Windows): let the `.dll` files are found when running the testsJohannes Schindelin via GitGitGadget, Sep 25, 2020
  15. Eric SunshineSep 25, 2020
  16. Johannes SchindelinSep 26, 2020
  17. 05/10 cmake: quote the path accurately when editing `test-lib.sh`Johannes Schindelin via GitGitGadget, Sep 25, 2020
  18. 08/10 cmake (Windows): initialize vcpkg/build dependencies automaticallyJohannes Schindelin via GitGitGadget, Sep 25, 2020
  19. Sibi SiddharthanSep 30, 2020
  20. Johannes SchindelinSep 30, 2020
  21. 09/10 cmake (Windows): recommend using Visual Studio's built-in CMake supportJohannes Schindelin via GitGitGadget, Sep 25, 2020
  22. Junio C HamanoSep 25, 2020
  23. Johannes SchindelinSep 26, 2020
  24. 10/10 hashmap_for_each_entry(): work around MSVC's run-time check failure #3Johannes Schindelin via GitGitGadget, Sep 25, 2020
  25. Junio C HamanoSep 25, 2020
  26. Junio C HamanoSep 26, 2020
  27. Johannes SchindelinSep 26, 2020
  28. 04/10 cmake: fall back to using `vcpkg`'s `msgfmt.exe` on WindowsJohannes Schindelin via GitGitGadget, Sep 25, 2020
  29. 00/10 CMake and Visual StudioJohannes Schindelin via GitGitGadget, Sep 26, 2020
  30. 01/10 cmake: ignore files generated by CMake as run in Visual StudioJohannes Schindelin via GitGitGadget, Sep 26, 2020
  31. 05/10 cmake: quote the path accurately when editing `test-lib.sh`Johannes Schindelin via GitGitGadget, Sep 26, 2020
  32. 03/10 cmake: ensure that the `vcpkg` packages are found on WindowsJohannes Schindelin via GitGitGadget, Sep 26, 2020
  33. 04/10 cmake: fall back to using `vcpkg`'s `msgfmt.exe` on WindowsJohannes Schindelin via GitGitGadget, Sep 26, 2020
  34. 02/10 cmake: do find Git for Windows' shell interpreterJohannes Schindelin via GitGitGadget, Sep 26, 2020
  35. Øystein WalleSep 28, 2020
  36. Johannes SchindelinSep 28, 2020
  37. 10/10 hashmap_for_each_entry(): workaround MSVC's runtime check failure #3Junio C Hamano via GitGitGadget, Sep 26, 2020
  38. 09/10 cmake (Windows): recommend using Visual Studio's built-in CMake supportJohannes Schindelin via GitGitGadget, Sep 26, 2020
  39. 08/10 cmake (Windows): initialize vcpkg/build dependencies automaticallyJohannes Schindelin via GitGitGadget, Sep 26, 2020
  40. 06/10 cmake (Windows): let the `.dll` files be found when running the testsJohannes Schindelin via GitGitGadget, Sep 26, 2020
  41. 07/10 cmake (Windows): complain when encountering an unknown compilerJohannes Schindelin via GitGitGadget, Sep 26, 2020
  42. 00/11 CMake and Visual StudioJohannes Schindelin via GitGitGadget, Sep 28, 2020
  43. 01/11 cmake: ignore files generated by CMake as run in Visual StudioJohannes Schindelin via GitGitGadget, Sep 28, 2020
  44. 03/11 cmake: ensure that the `vcpkg` packages are found on WindowsJohannes Schindelin via GitGitGadget, Sep 28, 2020
  45. 02/11 cmake: do find Git for Windows' shell interpreterJohannes Schindelin via GitGitGadget, Sep 28, 2020
  46. 05/11 cmake: quote the path accurately when editing `test-lib.sh`Johannes Schindelin via GitGitGadget, Sep 28, 2020
  47. 04/11 cmake: fall back to using `vcpkg`'s `msgfmt.exe` on WindowsJohannes Schindelin via GitGitGadget, Sep 28, 2020
  48. 09/11 cmake (Windows): recommend using Visual Studio's built-in CMake supportJohannes Schindelin via GitGitGadget, Sep 28, 2020
  49. 10/11 hashmap_for_each_entry(): workaround MSVC's runtime check failure #3Junio C Hamano via GitGitGadget, Sep 28, 2020
  50. 06/11 cmake (Windows): let the `.dll` files be found when running the testsJohannes Schindelin via GitGitGadget, Sep 28, 2020
  51. 07/11 cmake (Windows): complain when encountering an unknown compilerJohannes Schindelin via GitGitGadget, Sep 28, 2020
  52. 11/11 cmake: fix typo in message when `msgfmt` was not foundJohannes Schindelin via GitGitGadget, Sep 28, 2020
  53. Junio C HamanoSep 28, 2020
  54. Johannes SchindelinSep 29, 2020
  55. 08/11 cmake (Windows): initialize vcpkg/build dependencies automaticallyJohannes Schindelin via GitGitGadget, Sep 28, 2020
  56. Sibi SiddharthanSep 29, 2020
  57. Johannes SchindelinSep 29, 2020
  58. 00/10 CMake and Visual StudioJohannes Schindelin via GitGitGadget, Sep 30, 2020
  59. 05/10 cmake: quote the path accurately when editing `test-lib.sh`Johannes Schindelin via GitGitGadget, Sep 30, 2020
  60. 04/10 cmake: fall back to using `vcpkg`'s `msgfmt.exe` on WindowsJohannes Schindelin via GitGitGadget, Sep 30, 2020
  61. 06/10 cmake (Windows): let the `.dll` files be found when running the testsJohannes Schindelin via GitGitGadget, Sep 30, 2020
  62. 07/10 cmake (Windows): complain when encountering an unknown compilerJohannes Schindelin via GitGitGadget, Sep 30, 2020
  63. 08/10 cmake (Windows): initialize vcpkg/build dependencies automaticallyJohannes Schindelin via GitGitGadget, Sep 30, 2020
  64. Johannes SchindelinSep 30, 2020
  65. Junio C HamanoSep 30, 2020
  66. 09/10 cmake (Windows): recommend using Visual Studio's built-in CMake supportJohannes Schindelin via GitGitGadget, Sep 30, 2020
  67. 10/10 hashmap_for_each_entry(): workaround MSVC's runtime check failure #3Junio C Hamano via GitGitGadget, Sep 30, 2020
  68. 02/10 cmake: do find Git for Windows' shell interpreterJohannes Schindelin via GitGitGadget, Sep 30, 2020
  69. 03/10 cmake: ensure that the `vcpkg` packages are found on WindowsJohannes Schindelin via GitGitGadget, Sep 30, 2020
  70. 01/10 cmake: ignore files generated by CMake as run in Visual StudioJohannes Schindelin via GitGitGadget, Sep 30, 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.