1*673dc3d4SNico Weber // RUN: %clangxx_asan -O0 %s -o %t && %run %t
2*673dc3d4SNico Weber // RUN: %clangxx_asan -O0 %s -DPOSITIVE -o %t && not %run %t 2>&1 | FileCheck %s
3*673dc3d4SNico Weber 
4*673dc3d4SNico Weber // Test the readv() interceptor.
5*673dc3d4SNico Weber 
6*673dc3d4SNico Weber #include <assert.h>
7*673dc3d4SNico Weber #include <stdio.h>
8*673dc3d4SNico Weber #include <stdlib.h>
9*673dc3d4SNico Weber #include <unistd.h>
10*673dc3d4SNico Weber #include <fcntl.h>
11*673dc3d4SNico Weber #include <sys/uio.h>
12*673dc3d4SNico Weber #include <time.h>
13*673dc3d4SNico Weber 
main()14*673dc3d4SNico Weber int main() {
15*673dc3d4SNico Weber   char buf[2011];
16*673dc3d4SNico Weber   struct iovec iov[2];
17*673dc3d4SNico Weber #ifdef POSITIVE
18*673dc3d4SNico Weber   char * volatile buf_ = buf;
19*673dc3d4SNico Weber   iov[0].iov_base = buf_ - 1;
20*673dc3d4SNico Weber #else
21*673dc3d4SNico Weber   iov[0].iov_base = buf + 1;
22*673dc3d4SNico Weber #endif
23*673dc3d4SNico Weber   iov[0].iov_len = 5;
24*673dc3d4SNico Weber   iov[1].iov_base = buf + 10;
25*673dc3d4SNico Weber   iov[1].iov_len = 2000;
26*673dc3d4SNico Weber   int fd = open("/etc/hosts", O_RDONLY);
27*673dc3d4SNico Weber   assert(fd > 0);
28*673dc3d4SNico Weber   readv(fd, iov, 2);
29*673dc3d4SNico Weber   // CHECK: WRITE of size 5 at
30*673dc3d4SNico Weber   close(fd);
31*673dc3d4SNico Weber   return 0;
32*673dc3d4SNico Weber }
33