brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.0 KiB · e972870 Raw
59 lines · cpp
1// RUN: %clangxx_hwasan  -mllvm -hwasan-use-stack-safety=0 -O2 %s -o %t && \2// RUN:     %run %t 2>&13 4// REQUIRES: aarch64-target-arch || riscv64-target-arch5 6#include <sanitizer/hwasan_interface.h>7#include <setjmp.h>8#include <stdlib.h>9#include <string.h>10 11#include <sys/types.h>12#include <unistd.h>13 14volatile const char *stackbuf = nullptr;15jmp_buf jbuf;16 17__attribute__((noinline)) bool jump() {18  // Fool the compiler so it cannot deduce noreturn.19  if (getpid() != 0) {20    longjmp(jbuf, 1);21    return true;22  }23  return false;24}25 26bool target() {27  switch (setjmp(jbuf)) {28  case 1:29    return false;30  default:31    break;32  }33 34  while (true) {35    char buf[4096];36    stackbuf = buf;37    if (!jump()) {38      break;39    };40  }41  return true;42}43 44int main() {45  target();46 47  void *untagged = __hwasan_tag_pointer(stackbuf, 0);48  if (stackbuf == untagged) {49    // The buffer wasn't tagged in the first place, so the test will not work50    // as expected.51    return 2;52  }53  if (__hwasan_test_shadow(untagged, 4096) != -1) {54    return 1;55  }56 57  return 0;58}59