Skip to content

Commit d814006

Browse files
authored
[ASan][test] Fix Posix/coverage-fork.cpp on Solaris (#109626)
With ASan testing enabled on SPARC as per PR #107405, the ``` AddressSanitizer-sparc-sunos-dynamic :: TestCases/Posix/coverage-fork.cpp ``` test occasionally `FAIL`s on Solaris/sparcv9: ``` compiler-rt/test/asan/TestCases/Posix/coverage-fork.cpp:46:15: error: CHECK-DAG: expected string not found in input // CHECK-DAG: Parent PID: [[ParentPID:[0-9]+]] ^ ``` It turns out that the output for parent and child processes is interleaved like ``` Parent PID: Child PID: 27426 27425 ``` Checking with `truss` shows that the `fprintf`s are implemented as 3 separate `write`s: ``` 28489: write(2, " P a r e n t P I D : ", 12) = 12 28489: write(2, " 2 8 4 8 9", 5) = 5 28489: write(2, "\n", 1) = 1 ``` To avoid this, this patch switches the test to use `snprintf`/`write` to guarantee the output is atomic. Tested on `sparcv9-sun-solaris2.11`, `amd64-pc-solaris2.11`, and `x86_64-pc-linux-gnu`.
1 parent 4a264c5 commit d814006

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

compiler-rt/test/asan/TestCases/Posix/coverage-fork.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,14 @@ void baz() { printf("baz\n"); }
2626

2727
int main(int argc, char **argv) {
2828
pid_t child_pid = fork();
29+
char buf[100];
2930
if (child_pid == 0) {
30-
fprintf(stderr, "Child PID: %d\n", getpid());
31+
snprintf(buf, sizeof(buf), "Child PID: %ld\n", (long)getpid());
32+
write(2, buf, strlen(buf));
3133
baz();
3234
} else {
33-
fprintf(stderr, "Parent PID: %d\n", getpid());
35+
snprintf(buf, sizeof(buf), "Parent PID: %ld\n", (long)getpid());
36+
write(2, buf, strlen(buf));
3437
foo();
3538
bar();
3639

0 commit comments

Comments
 (0)