1021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov// RUN: %clangxx_msan -m64 -O0 %s -o %t && %t >%t.out 2>&1 2021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov// RUN: %clangxx_msan -m64 -O1 %s -o %t && not %t >%t.out 2>&1 3021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov// RUN: FileCheck %s < %t.out 4021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov// RUN: %clangxx_msan -m64 -O2 %s -o %t && not %t >%t.out 2>&1 5021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov// RUN: FileCheck %s < %t.out 6021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov// RUN: %clangxx_msan -m64 -O3 %s -o %t && not %t >%t.out 2>&1 7021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov// RUN: FileCheck %s < %t.out 8021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov 9021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov// Test that (no_sanitize_memory) functions propagate shadow. 10021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov 11021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov// Note that at -O0 there is no report, because 'x' in 'f' is spilled to the 12021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov// stack, and then loaded back as a fully initialiazed value (due to 13021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov// no_sanitize_memory attribute). 14021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov 15021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov#include <stdlib.h> 16021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov#include <stdio.h> 17021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov 18021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov__attribute__((noinline)) 19021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov__attribute__((no_sanitize_memory)) 20021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanovint f(int x) { 21021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov return x; 22021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov} 23021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov 24021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanovint main(void) { 25021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov int x; 26021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov int * volatile p = &x; 27021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov int y = f(*p); 286ac157da0bcbd2951ee110d8da27eb188d2a3cd7Evgeniy Stepanov // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value 29021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov // CHECK: {{#0 0x.* in main .*no_sanitize_memory_prop.cc:}}[[@LINE+1]] 30021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov if (y) 31021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov exit(0); 32021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov return 0; 33021ba5182db571f527fd4fbc5a3a6e96bd3fce74Evgeniy Stepanov} 34