The return type of `internal_strlen()` is 'uptr', but in `printf_common()` we store the result of `internal_strlen()` into an 'int' type variable. When the result value of `internal_strlen()` is larger than the largest possible value of 'int' type, the implicit conversion from 'uptr' to 'int' will change the result value to a negative value. Without this change, asan reports a false positive negative-size-param in the added testcase. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D157266
35 lines
868 B
C++
35 lines
868 B
C++
// Test that the common part implementation of *printf interceptors does not
|
|
// cause negative-size-param false positives.
|
|
|
|
// RUN: %clangxx -O2 %s -o %t
|
|
// RUN: %env_tool_opts=check_printf=1 %run %t 2>&1
|
|
|
|
// FIXME: The maximum supported allocation size is too platform-specific:
|
|
// REQUIRES: x86_64-target-arch
|
|
|
|
// FIXME: printf is not intercepted on Windows yet.
|
|
// UNSUPPORTED: target={{.*windows-msvc.*}}
|
|
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
void write(char *buf, int buf_size, const char *fmt, ...) {
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
vsnprintf(buf, buf_size, fmt, args);
|
|
va_end(args);
|
|
}
|
|
|
|
int main() {
|
|
char buffer[100];
|
|
const size_t kStrSize = 1UL << 31;
|
|
char *x = (char *)malloc(kStrSize);
|
|
memset(x, '=', kStrSize - 1);
|
|
x[kStrSize - 1] = 0;
|
|
write(buffer, 100, "%s\n", x);
|
|
free(x);
|
|
return 0;
|
|
}
|