brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 43d0a2d Raw
96 lines · c
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,debug.ExprInspection -verify %s2 3// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,alpha.unix,debug.ExprInspection -verify %s4 5#include "Inputs/system-header-simulator.h"6#include "Inputs/system-header-simulator-for-malloc.h"7 8void test_getline_null_buffer() {9  FILE *F1 = tmpfile();10  if (!F1)11    return;12  char *buffer = NULL;13  size_t n = 0;14  if (getline(&buffer, &n, F1) > 0) {15    char c = buffer[0]; // ok16  }17  free(buffer);18  fclose(F1);19}20 21void test_getline_malloc_buffer() {22  FILE *F1 = tmpfile();23  if (!F1)24    return;25 26  size_t n = 10;27  char *buffer = malloc(n);28  char *ptr = buffer;29 30  ssize_t r = getdelim(&buffer, &n, '\r', F1);31  // ptr may be dangling32  free(ptr);    // expected-warning {{Attempt to release already released memory}}33  free(buffer); // ok34  fclose(F1);35}36 37void test_getline_alloca() {38  FILE *F1 = tmpfile();39  if (!F1)40    return;41  size_t n = 10;42  char *buffer = alloca(n);43  getline(&buffer, &n, F1); // expected-warning {{Memory allocated by 'alloca()' should not be deallocated}}44  fclose(F1);45}46 47void test_getline_invalid_ptr() {48  FILE *F1 = tmpfile();49  if (!F1)50    return;51  size_t n = 10;52  char *buffer = (char*)test_getline_invalid_ptr;53  getline(&buffer, &n, F1); // expected-warning {{Argument to 'getline()' is the address of the function 'test_getline_invalid_ptr', which is not memory allocated by 'malloc()'}}54  fclose(F1);55}56 57void test_getline_leak() {58  FILE *F1 = tmpfile();59  if (!F1)60    return;61 62  char *buffer = NULL;63  size_t n = 0;64  ssize_t read;65 66  while ((read = getline(&buffer, &n, F1)) != -1) {67    printf("%s\n", buffer);68  }69 70  fclose(F1); // expected-warning {{Potential memory leak}}71}72 73void test_getline_stack() {74  size_t n = 10;75  char buffer[10];76  char *ptr = buffer;77 78  FILE *F1 = tmpfile();79  if (!F1)80    return;81 82  getline(&ptr, &n, F1); // expected-warning {{Argument to 'getline()' is the address of the local variable 'buffer', which is not memory allocated by 'malloc()'}}83}84 85void test_getline_static() {86  static size_t n = 10;87  static char buffer[10];88  char *ptr = buffer;89 90  FILE *F1 = tmpfile();91  if (!F1)92    return;93 94  getline(&ptr, &n, F1); // expected-warning {{Argument to 'getline()' is the address of the static variable 'buffer', which is not memory allocated by 'malloc()'}}95}96