1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.cstring,alpha.unix.cstring,debug.ExprInspection -analyzer-store=region -verify %s 2*67e74705SXin Li 3*67e74705SXin Li #include "Inputs/system-header-simulator-cxx.h" 4*67e74705SXin Li #include "Inputs/system-header-simulator-for-malloc.h" 5*67e74705SXin Li 6*67e74705SXin Li void clang_analyzer_eval(int); 7*67e74705SXin Li testStdCopyInvalidatesBuffer(std::vector<int> v)8*67e74705SXin Liint *testStdCopyInvalidatesBuffer(std::vector<int> v) { 9*67e74705SXin Li int n = v.size(); 10*67e74705SXin Li int *buf = (int *)malloc(n * sizeof(int)); 11*67e74705SXin Li 12*67e74705SXin Li buf[0] = 66; 13*67e74705SXin Li 14*67e74705SXin Li // Call to copy should invalidate buf. 15*67e74705SXin Li std::copy(v.begin(), v.end(), buf); 16*67e74705SXin Li 17*67e74705SXin Li int i = buf[0]; 18*67e74705SXin Li 19*67e74705SXin Li clang_analyzer_eval(i == 66); // expected-warning {{UNKNOWN}} 20*67e74705SXin Li 21*67e74705SXin Li return buf; 22*67e74705SXin Li } 23*67e74705SXin Li testStdCopyBackwardInvalidatesBuffer(std::vector<int> v)24*67e74705SXin Liint *testStdCopyBackwardInvalidatesBuffer(std::vector<int> v) { 25*67e74705SXin Li int n = v.size(); 26*67e74705SXin Li int *buf = (int *)malloc(n * sizeof(int)); 27*67e74705SXin Li 28*67e74705SXin Li buf[0] = 66; 29*67e74705SXin Li 30*67e74705SXin Li // Call to copy_backward should invalidate buf. 31*67e74705SXin Li std::copy_backward(v.begin(), v.end(), buf + n); 32*67e74705SXin Li 33*67e74705SXin Li int i = buf[0]; 34*67e74705SXin Li 35*67e74705SXin Li clang_analyzer_eval(i == 66); // expected-warning {{UNKNOWN}} 36*67e74705SXin Li 37*67e74705SXin Li return buf; 38*67e74705SXin Li } 39