From e8557caace66b058e3048de7eff954baaa6c0493 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Wed, 6 Sep 2017 23:05:35 -0400 Subject: parse: Don't reorder or remove tests with potential side effects -empty and -xtype may have side effects like reporting permission errors, which even affect the exit status of bfs. We shouldn't remove these effects without -Ofast. --- parse.c | 24 +++++++++++++++++++++--- tests.sh | 8 ++++++++ tests/test_xtype_reorder.out | 0 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 tests/test_xtype_reorder.out diff --git a/parse.c b/parse.c index 811ec5a..f6cde7a 100644 --- a/parse.c +++ b/parse.c @@ -1003,10 +1003,20 @@ static struct expr *parse_depth_limit(struct parser_state *state, int is_min, in */ static struct expr *parse_empty(struct parser_state *state, int arg1, int arg2) { struct expr *expr = parse_nullary_test(state, eval_empty); - if (expr) { - expr->cost = 2000.0; - expr->probability = 0.01; + if (!expr) { + return NULL; + } + + expr->cost = 2000.0; + expr->probability = 0.01; + + if (state->cmdline->optlevel < 4) { + // Since -empty attempts to open and read directories, it may + // have side effects such as reporting permission errors, and + // thus shouldn't be re-ordered without aggressive optimizations + expr->pure = false; } + return expr; } @@ -2103,6 +2113,14 @@ static struct expr *parse_type(struct parser_state *state, int x, int arg2) { expr->idata = types; expr->probability = probability; + + if (x && state->cmdline->optlevel < 4) { + // Since -xtype dereferences symbolic links, it may have side + // effects such as reporting permission errors, and thus + // shouldn't be re-ordered without aggressive optimizations + expr->pure = false; + } + return expr; fail: diff --git a/tests.sh b/tests.sh index 620bc2a..2007d0a 100755 --- a/tests.sh +++ b/tests.sh @@ -374,6 +374,7 @@ gnu_tests=( bfs_tests=( test_type_multi test_xtype_multi + test_xtype_reorder test_perm_symbolic_trailing_comma test_perm_symbolic_double_comma test_perm_symbolic_missing_action @@ -755,6 +756,13 @@ function test_xtype_multi() { bfs_diff links -xtype f,d,c 2>/dev/null } +function test_xtype_reorder() { + # Make sure -xtype is not reordered in front of anything -- if -xtype runs + # before -links 100, it will report an ELOOP error + bfs_diff links -links 100 -xtype l + invoke_bfs links -links 100 -xtype l +} + function test_iname() { bfs_diff basic -iname '*F*' } diff --git a/tests/test_xtype_reorder.out b/tests/test_xtype_reorder.out new file mode 100644 index 0000000..e69de29 -- cgit v1.2.3