1cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar// RUN: %clangxx_asan -O0 -mllvm -asan-instrument-allocas %s -o %t
2cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar// RUN: %run %t 2>&1
3cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar//
4cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar// REQUIRES: stable-runtime
5cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar
6cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar// This testcase checks that allocas and VLAs inside loop are correctly unpoisoned.
7cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar
8cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#include <assert.h>
9cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#include <stdint.h>
103d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#include <stdlib.h>
11cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#include "sanitizer/asan_interface.h"
12cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar
133d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// MSVC provides _alloca instead of alloca.
143d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#if defined(_MSC_VER) && !defined(alloca)
153d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define alloca _alloca
163d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif
173d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar
18cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainarvoid *top, *bot;
19cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar
20cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar__attribute__((noinline)) void foo(int len) {
21cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  char x;
22cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  top = &x;
23cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  char array[len];  // NOLINT
24cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  assert(!(reinterpret_cast<uintptr_t>(array) & 31L));
25cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  alloca(len);
26cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  for (int i = 0; i < 32; ++i) {
27cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar    char array[i];  // NOLINT
28cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar    bot = alloca(i);
29cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar    assert(!(reinterpret_cast<uintptr_t>(bot) & 31L));
30cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  }
31cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar}
32cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar
33cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainarint main(int argc, char **argv) {
34cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  foo(32);
35cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  void *q = __asan_region_is_poisoned(bot, (char *)top - (char *)bot);
36cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  assert(!q);
37cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  return 0;
38cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar}
39