xref: /aosp_15_r20/external/clang/test/Analysis/bstring.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li int *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 Li int *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