summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2024-02-12 14:36:52 -0500
committerTavian Barnes <tavianator@tavianator.com>2024-02-12 14:36:52 -0500
commit4ddbaf8a44e4bf46d3ebe3c5afc957ecd07cfa0a (patch)
tree0a7931c79ea13b9032a8e4958f88024b084feacc
parenta98fe72db88350fcec030487208e6c50c9de1974 (diff)
downloadbfs-4ddbaf8a44e4bf46d3ebe3c5afc957ecd07cfa0a.tar.xz
sanity: Don't use self-init for uninit()
Self-initialization like bool ret = ret; is a GCC trick to suppress uninitialized variable warnings, but it's not actually well-defined, and will trip a recent enough MemorySanitizer: src/eval.c:1088:13: runtime error: load of value 128, which is not a valid value for type 'bool'
-rw-r--r--src/eval.c2
-rw-r--r--src/parse.c8
-rw-r--r--src/sanity.h4
3 files changed, 7 insertions, 7 deletions
diff --git a/src/eval.c b/src/eval.c
index a4c0c11..6d7afad 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -1085,7 +1085,7 @@ bool eval_or(const struct bfs_expr *expr, struct bfs_eval *state) {
* Evaluate the comma operator.
*/
bool eval_comma(const struct bfs_expr *expr, struct bfs_eval *state) {
- bool ret = uninit(ret, false);
+ bool ret uninit(false);
for (struct bfs_expr *child = bfs_expr_children(expr); child; child = child->next) {
ret = eval_expr(child, state);
diff --git a/src/parse.c b/src/parse.c
index 3a78840..5d0f333 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -1891,11 +1891,11 @@ static int parse_mode(const struct bfs_parser *parser, const char *mode, struct
MODE_PLUS,
MODE_MINUS,
MODE_EQUALS,
- } op = uninit(op, MODE_EQUALS);
+ } op uninit(MODE_EQUALS);
- mode_t who = uninit(who, 0);
- mode_t file_change = uninit(file_change, 0);
- mode_t dir_change = uninit(dir_change, 0);
+ mode_t who uninit(0);
+ mode_t file_change uninit(0);
+ mode_t dir_change uninit(0);
const char *i = mode;
while (true) {
diff --git a/src/sanity.h b/src/sanity.h
index 29b3519..423e6ff 100644
--- a/src/sanity.h
+++ b/src/sanity.h
@@ -86,9 +86,9 @@
* Initialize a variable, unless sanitizers would detect uninitialized uses.
*/
#if SANITIZE_MEMORY
-# define uninit(var, value) var
+# define uninit(value)
#else
-# define uninit(var, value) value
+# define uninit(value) = value
#endif
#endif // BFS_SANITY_H