| // RUN: %clangxx_msan -g %s -o %t |
| // RUN: %run %t |
| // RUN: not %run %t 2 2>&1 | FileCheck %s --check-prefix=CHECK-FPUTS |
| // RUN: not %run %t 3 3 2>&1 | FileCheck %s --check-prefix=CHECK-PUTS |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| int test_fgets() { |
| FILE *fp = fopen("/dev/zero", "r"); |
| char c; |
| |
| if (!fgets(&c, 1, fp)) |
| return 1; |
| |
| if (c == '1') // No error |
| return 2; |
| |
| fclose(fp); |
| return 0; |
| } |
| |
| int test_fputs() { |
| FILE *fp = fopen("/dev/null", "w"); |
| char buf[2]; |
| fputs(buf, fp); // BOOM |
| return fclose(fp); |
| } |
| |
| void test_puts() { |
| char buf[2]; |
| puts(buf); // BOOM |
| } |
| |
| int main(int argc, char *argv[]) { |
| if (argc == 1) |
| test_fgets(); |
| else if (argc == 2) |
| test_fputs(); |
| else |
| test_puts(); |
| return 0; |
| } |
| |
| // CHECK-FPUTS: Uninitialized bytes in fputs at offset 0 inside |
| // CHECK-PUTS: Uninitialized bytes in puts at offset 0 inside |