Skip to content

Commit 06eeca1

Browse files
guidosarduccianakryiko
authored andcommitted
selftests/bpf: Fix using stdout, stderr as struct field names
Typically stdin, stdout, stderr are treated as reserved identifiers under ISO/ANSI C and libc implementations further define these as macros, both in glibc and musl <stdio.h>. However, while glibc defines: ... /* Standard streams. */ extern FILE *stdin; /* Standard input stream. */ extern FILE *stdout; /* Standard output stream. */ extern FILE *stderr; /* Standard error output stream. */ /* C89/C99 say they're macros. Make them happy. */ #define stdin stdin #define stdout stdout #define stderr stderr ... musl instead uses (legally): ... extern FILE *const stdin; extern FILE *const stdout; extern FILE *const stderr; #define stdin (stdin) #define stdout (stdout) #define stderr (stderr) ... The latter results in compile errors when the names are reused as fields of 'struct test_env' and elsewhere in test_progs.[ch] and reg_bounds.c. Rename the fields to stdout_saved and stderr_saved to avoid many errors seen building against musl, e.g.: In file included from test_progs.h:6, from test_progs.c:5: test_progs.c: In function 'print_test_result': test_progs.c:237:21: error: expected identifier before '(' token 237 | fprintf(env.stdout, "#%-*d %s:", TEST_NUM_WIDTH, test->test_num, test->test_name); | ^~~~~~ test_progs.c:237:9: error: too few arguments to function 'fprintf' 237 | fprintf(env.stdout, "#%-*d %s:", TEST_NUM_WIDTH, test->test_num, test->test_name); | ^~~~~~~ Signed-off-by: Tony Ambardar <[email protected]> Signed-off-by: Andrii Nakryiko <[email protected]> Link: https://lore.kernel.org/bpf/ZqR2DuHdBXPX%2Fyx8@kodidev-ubuntu/ Link: https://lore.kernel.org/bpf/684ea17548e237f39dfb3f7a3d33450069015b21.1722244708.git.tony.ambardar@gmail.com
1 parent c9a83e7 commit 06eeca1

File tree

3 files changed

+38
-38
lines changed

3 files changed

+38
-38
lines changed

tools/testing/selftests/bpf/prog_tests/reg_bounds.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1487,7 +1487,7 @@ static int verify_case_opt(struct ctx *ctx, enum num_t init_t, enum num_t cond_t
14871487
u64 elapsed_ns = get_time_ns() - ctx->start_ns;
14881488
double remain_ns = elapsed_ns / progress * (1 - progress);
14891489

1490-
fprintf(env.stderr, "PROGRESS (%s): %d/%d (%.2lf%%), "
1490+
fprintf(env.stderr_saved, "PROGRESS (%s): %d/%d (%.2lf%%), "
14911491
"elapsed %llu mins (%.2lf hrs), "
14921492
"ETA %.0lf mins (%.2lf hrs)\n",
14931493
ctx->progress_ctx,

tools/testing/selftests/bpf/test_progs.c

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,15 @@ static void stdio_hijack_init(char **log_buf, size_t *log_cnt)
5151

5252
stdout = open_memstream(log_buf, log_cnt);
5353
if (!stdout) {
54-
stdout = env.stdout;
54+
stdout = env.stdout_saved;
5555
perror("open_memstream");
5656
return;
5757
}
5858

5959
if (env.subtest_state)
60-
env.subtest_state->stdout = stdout;
60+
env.subtest_state->stdout_saved = stdout;
6161
else
62-
env.test_state->stdout = stdout;
62+
env.test_state->stdout_saved = stdout;
6363

6464
stderr = stdout;
6565
#endif
@@ -73,8 +73,8 @@ static void stdio_hijack(char **log_buf, size_t *log_cnt)
7373
return;
7474
}
7575

76-
env.stdout = stdout;
77-
env.stderr = stderr;
76+
env.stdout_saved = stdout;
77+
env.stderr_saved = stderr;
7878

7979
stdio_hijack_init(log_buf, log_cnt);
8080
#endif
@@ -91,13 +91,13 @@ static void stdio_restore_cleanup(void)
9191
fflush(stdout);
9292

9393
if (env.subtest_state) {
94-
fclose(env.subtest_state->stdout);
95-
env.subtest_state->stdout = NULL;
96-
stdout = env.test_state->stdout;
97-
stderr = env.test_state->stdout;
94+
fclose(env.subtest_state->stdout_saved);
95+
env.subtest_state->stdout_saved = NULL;
96+
stdout = env.test_state->stdout_saved;
97+
stderr = env.test_state->stdout_saved;
9898
} else {
99-
fclose(env.test_state->stdout);
100-
env.test_state->stdout = NULL;
99+
fclose(env.test_state->stdout_saved);
100+
env.test_state->stdout_saved = NULL;
101101
}
102102
#endif
103103
}
@@ -110,13 +110,13 @@ static void stdio_restore(void)
110110
return;
111111
}
112112

113-
if (stdout == env.stdout)
113+
if (stdout == env.stdout_saved)
114114
return;
115115

116116
stdio_restore_cleanup();
117117

118-
stdout = env.stdout;
119-
stderr = env.stderr;
118+
stdout = env.stdout_saved;
119+
stderr = env.stderr_saved;
120120
#endif
121121
}
122122

@@ -244,25 +244,25 @@ static void print_test_result(const struct prog_test_def *test, const struct tes
244244
int skipped_cnt = test_state->skip_cnt;
245245
int subtests_cnt = test_state->subtest_num;
246246

247-
fprintf(env.stdout, "#%-*d %s:", TEST_NUM_WIDTH, test->test_num, test->test_name);
247+
fprintf(env.stdout_saved, "#%-*d %s:", TEST_NUM_WIDTH, test->test_num, test->test_name);
248248
if (test_state->error_cnt)
249-
fprintf(env.stdout, "FAIL");
249+
fprintf(env.stdout_saved, "FAIL");
250250
else if (!skipped_cnt)
251-
fprintf(env.stdout, "OK");
251+
fprintf(env.stdout_saved, "OK");
252252
else if (skipped_cnt == subtests_cnt || !subtests_cnt)
253-
fprintf(env.stdout, "SKIP");
253+
fprintf(env.stdout_saved, "SKIP");
254254
else
255-
fprintf(env.stdout, "OK (SKIP: %d/%d)", skipped_cnt, subtests_cnt);
255+
fprintf(env.stdout_saved, "OK (SKIP: %d/%d)", skipped_cnt, subtests_cnt);
256256

257-
fprintf(env.stdout, "\n");
257+
fprintf(env.stdout_saved, "\n");
258258
}
259259

260260
static void print_test_log(char *log_buf, size_t log_cnt)
261261
{
262262
log_buf[log_cnt] = '\0';
263-
fprintf(env.stdout, "%s", log_buf);
263+
fprintf(env.stdout_saved, "%s", log_buf);
264264
if (log_buf[log_cnt - 1] != '\n')
265-
fprintf(env.stdout, "\n");
265+
fprintf(env.stdout_saved, "\n");
266266
}
267267

268268
static void print_subtest_name(int test_num, int subtest_num,
@@ -273,14 +273,14 @@ static void print_subtest_name(int test_num, int subtest_num,
273273

274274
snprintf(test_num_str, sizeof(test_num_str), "%d/%d", test_num, subtest_num);
275275

276-
fprintf(env.stdout, "#%-*s %s/%s",
276+
fprintf(env.stdout_saved, "#%-*s %s/%s",
277277
TEST_NUM_WIDTH, test_num_str,
278278
test_name, subtest_name);
279279

280280
if (result)
281-
fprintf(env.stdout, ":%s", result);
281+
fprintf(env.stdout_saved, ":%s", result);
282282

283-
fprintf(env.stdout, "\n");
283+
fprintf(env.stdout_saved, "\n");
284284
}
285285

286286
static void jsonw_write_log_message(json_writer_t *w, char *log_buf, size_t log_cnt)
@@ -465,15 +465,15 @@ bool test__start_subtest(const char *subtest_name)
465465
memset(subtest_state, 0, sub_state_size);
466466

467467
if (!subtest_name || !subtest_name[0]) {
468-
fprintf(env.stderr,
468+
fprintf(env.stderr_saved,
469469
"Subtest #%d didn't provide sub-test name!\n",
470470
state->subtest_num);
471471
return false;
472472
}
473473

474474
subtest_state->name = strdup(subtest_name);
475475
if (!subtest_state->name) {
476-
fprintf(env.stderr,
476+
fprintf(env.stderr_saved,
477477
"Subtest #%d: failed to copy subtest name!\n",
478478
state->subtest_num);
479479
return false;
@@ -1043,7 +1043,7 @@ void crash_handler(int signum)
10431043

10441044
sz = backtrace(bt, ARRAY_SIZE(bt));
10451045

1046-
if (env.stdout)
1046+
if (env.stdout_saved)
10471047
stdio_restore();
10481048
if (env.test) {
10491049
env.test_state->error_cnt++;
@@ -1359,7 +1359,7 @@ static void calculate_summary_and_print_errors(struct test_env *env)
13591359
if (env->json) {
13601360
w = jsonw_new(env->json);
13611361
if (!w)
1362-
fprintf(env->stderr, "Failed to create new JSON stream.");
1362+
fprintf(env->stderr_saved, "Failed to create new JSON stream.");
13631363
}
13641364

13651365
if (w) {
@@ -1708,16 +1708,16 @@ int main(int argc, char **argv)
17081708
return -1;
17091709
}
17101710

1711-
env.stdout = stdout;
1712-
env.stderr = stderr;
1711+
env.stdout_saved = stdout;
1712+
env.stderr_saved = stderr;
17131713

17141714
env.has_testmod = true;
17151715
if (!env.list_test_names) {
17161716
/* ensure previous instance of the module is unloaded */
17171717
unload_bpf_testmod(verbose());
17181718

17191719
if (load_bpf_testmod(verbose())) {
1720-
fprintf(env.stderr, "WARNING! Selftests relying on bpf_testmod.ko will be skipped.\n");
1720+
fprintf(env.stderr_saved, "WARNING! Selftests relying on bpf_testmod.ko will be skipped.\n");
17211721
env.has_testmod = false;
17221722
}
17231723
}
@@ -1795,7 +1795,7 @@ int main(int argc, char **argv)
17951795
}
17961796

17971797
if (env.list_test_names) {
1798-
fprintf(env.stdout, "%s\n", test->test_name);
1798+
fprintf(env.stdout_saved, "%s\n", test->test_name);
17991799
env.succ_cnt++;
18001800
continue;
18011801
}

tools/testing/selftests/bpf/test_progs.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ struct subtest_state {
7575
bool skipped;
7676
bool filtered;
7777

78-
FILE *stdout;
78+
FILE *stdout_saved;
7979
};
8080

8181
struct test_state {
@@ -92,7 +92,7 @@ struct test_state {
9292
size_t log_cnt;
9393
char *log_buf;
9494

95-
FILE *stdout;
95+
FILE *stdout_saved;
9696
};
9797

9898
struct test_env {
@@ -111,8 +111,8 @@ struct test_env {
111111
struct test_state *test_state; /* current running test state */
112112
struct subtest_state *subtest_state; /* current running subtest state */
113113

114-
FILE *stdout;
115-
FILE *stderr;
114+
FILE *stdout_saved;
115+
FILE *stderr_saved;
116116
int nr_cpus;
117117
FILE *json;
118118

0 commit comments

Comments
 (0)