1c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// Test strict_string_checks option in strcasestr function
2c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// RUN: %clang_asan %s -o %t && %run %t 2>&1
3c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// RUN: %env_asan_opts=strict_string_checks=false %run %t 2>&1
4c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// RUN: %env_asan_opts=strict_string_checks=true not %run %t 2>&1 | FileCheck %s
5c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
6c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// There's no interceptor for strcasestr on Windows
7c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// XFAIL: win32
8c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
9c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#define _GNU_SOURCE
10c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include <assert.h>
11c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include <stdlib.h>
12c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include <string.h>
13c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
14c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesint main(int argc, char **argv) {
15c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  size_t size = 100;
16c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  char *s1 = (char*)malloc(size);
176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  char *s2 = (char*)malloc(size);
186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  memset(s1, 'o', size);
196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  memset(s2, 'O', size);
20c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  s2[size - 1]='\0';
216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  char* r = strcasestr(s1, s2);
22c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // CHECK: {{.*ERROR: AddressSanitizer: heap-buffer-overflow on address}}
236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // CHECK: READ of size 101
24c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  assert(r == s1);
25c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  free(s1);
266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  free(s2);
276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return 0;
286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
29c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines