12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_msan -m64 -O0 %s -o %t && %run %t 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Check that strlen() and similar intercepted functions can be called on shadow 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// memory. 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <assert.h> 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdint.h> 82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h> 92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <string.h> 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesconst char *mem_to_shadow(const char *p) { 122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return (char *)((uintptr_t)p & ~0x400000000000ULL); 132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main(void) { 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines const char *s = "abcdef"; 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(strlen(s) == 6); 182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(strlen(mem_to_shadow(s)) == 0); 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *t = new char[42]; 212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines t[41] = 0; 222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(strlen(mem_to_shadow(t)) == 41); 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 0; 242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 25