Skip to content

[ASan][test] Fix Posix/coverage-fork.cpp on Solaris #109626

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged

Conversation

rorth
Copy link
Collaborator

@rorth rorth commented Sep 23, 2024

With ASan testing enabled on SPARC as per PR #107405, the

  AddressSanitizer-sparc-sunos-dynamic :: TestCases/Posix/coverage-fork.cpp

test occasionally FAILs 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 fprintfs are implemented as 3 separate writes:

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.

With ASan testing enabled on SPARC as per PR llvm#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`.
@llvmbot
Copy link
Member

llvmbot commented Sep 23, 2024

@llvm/pr-subscribers-compiler-rt-sanitizer

Author: Rainer Orth (rorth)

Changes

With ASan testing enabled on SPARC as per PR #107405, the

  AddressSanitizer-sparc-sunos-dynamic :: TestCases/Posix/coverage-fork.cpp

test occasionally FAILs 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 fprintfs are implemented as 3 separate writes:

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.


Full diff: https://github.com/llvm/llvm-project/pull/109626.diff

1 Files Affected:

  • (modified) compiler-rt/test/asan/TestCases/Posix/coverage-fork.cpp (+5-2)
diff --git a/compiler-rt/test/asan/TestCases/Posix/coverage-fork.cpp b/compiler-rt/test/asan/TestCases/Posix/coverage-fork.cpp
index fec9ba081b752c..a8768479de2f67 100644
--- a/compiler-rt/test/asan/TestCases/Posix/coverage-fork.cpp
+++ b/compiler-rt/test/asan/TestCases/Posix/coverage-fork.cpp
@@ -26,11 +26,14 @@ void baz() { printf("baz\n"); }
 
 int main(int argc, char **argv) {
   pid_t child_pid = fork();
+  char buf[100];
   if (child_pid == 0) {
-    fprintf(stderr, "Child PID: %d\n", getpid());
+    snprintf(buf, sizeof(buf), "Child PID: %ld\n", (long)getpid());
+    write(2, buf, strlen(buf));
     baz();
   } else {
-    fprintf(stderr, "Parent PID: %d\n", getpid());
+    snprintf(buf, sizeof(buf), "Parent PID: %ld\n", (long)getpid());
+    write(2, buf, strlen(buf));
     foo();
     bar();
 

@rorth rorth merged commit d814006 into llvm:main Sep 24, 2024
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants