xref: /llvm-project/compiler-rt/test/sanitizer_common/TestCases/vsnprintf.cpp (revision 94b0851aad618397f508e56c63c6f928e4e911b9)
1*94b0851aSEnna1 // Test that the common part implementation of *printf interceptors does not
2*94b0851aSEnna1 // cause negative-size-param false positives.
3*94b0851aSEnna1 
4*94b0851aSEnna1 // RUN: %clangxx -O2 %s -o %t
5*94b0851aSEnna1 // RUN: %env_tool_opts=check_printf=1 %run %t 2>&1
6*94b0851aSEnna1 
7*94b0851aSEnna1 // FIXME: The maximum supported allocation size is too platform-specific:
8*94b0851aSEnna1 // REQUIRES: x86_64-target-arch
9*94b0851aSEnna1 
10*94b0851aSEnna1 // FIXME: printf is not intercepted on Windows yet.
11*94b0851aSEnna1 // UNSUPPORTED: target={{.*windows-msvc.*}}
12*94b0851aSEnna1 
13*94b0851aSEnna1 #include <stdarg.h>
14*94b0851aSEnna1 #include <stdio.h>
15*94b0851aSEnna1 #include <stdlib.h>
16*94b0851aSEnna1 #include <string.h>
17*94b0851aSEnna1 
write(char * buf,int buf_size,const char * fmt,...)18*94b0851aSEnna1 void write(char *buf, int buf_size, const char *fmt, ...) {
19*94b0851aSEnna1   va_list args;
20*94b0851aSEnna1   va_start(args, fmt);
21*94b0851aSEnna1   vsnprintf(buf, buf_size, fmt, args);
22*94b0851aSEnna1   va_end(args);
23*94b0851aSEnna1 }
24*94b0851aSEnna1 
main()25*94b0851aSEnna1 int main() {
26*94b0851aSEnna1   char buffer[100];
27*94b0851aSEnna1   const size_t kStrSize = 1UL << 31;
28*94b0851aSEnna1   char *x = (char *)malloc(kStrSize);
29*94b0851aSEnna1   memset(x, '=', kStrSize - 1);
30*94b0851aSEnna1   x[kStrSize - 1] = 0;
31*94b0851aSEnna1   write(buffer, 100, "%s\n", x);
32*94b0851aSEnna1   free(x);
33*94b0851aSEnna1   return 0;
34*94b0851aSEnna1 }
35