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 Weberint 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