brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · eddfb32 Raw
89 lines · plain
1// RUN: %clang_analyze_cc1 -std=c++11 -fblocks %s \2// RUN:  -verify=newdelete \3// RUN:  -analyzer-checker=core \4// RUN:  -analyzer-checker=cplusplus.NewDelete5 6// leak-no-diagnostics7 8// RUN: %clang_analyze_cc1 -std=c++11 -DLEAKS -fblocks %s \9// RUN:   -verify=leak \10// RUN:   -analyzer-checker=core \11// RUN:   -analyzer-checker=cplusplus.NewDeleteLeaks12 13// RUN: %clang_analyze_cc1 -std=c++11 -DLEAKS -fblocks %s \14// RUN:   -verify=mismatch \15// RUN:   -analyzer-checker=core \16// RUN:   -analyzer-checker=unix.MismatchedDeallocator17 18#include "Inputs/system-header-simulator-cxx.h"19#include "Inputs/system-header-simulator-objc.h"20 21typedef __typeof__(sizeof(int)) size_t;22extern "C" void *malloc(size_t);23extern "C" void *alloca(size_t);24extern "C" void free(void *);25 26void testMallocFreeNoWarn() {27  int *p1 = (int *)malloc(sizeof(int));28  free(++p1); // no warn29 30  int *p2 = (int *)malloc(sizeof(int));31  free(p2);32  free(p2); // no warn33 34  int *p3 = (int *)malloc(sizeof(int)); // no warn35 36  int *p4 = (int *)malloc(sizeof(int));37  free(p4);38  int j = *p4; // no warn39 40  int *p5 = (int *)alloca(sizeof(int));41  free(p5); // no warn42}43 44void testDeleteMalloced() {45  int *p1 = (int *)malloc(sizeof(int));46  delete p1;47  // mismatch-warning@-1{{Memory allocated by 'malloc()' should be deallocated by 'free()', not 'delete'}}48 49  int *p2 = (int *)__builtin_alloca(sizeof(int));50  delete p2; // no warn51}52 53void testUseZeroAllocatedMalloced() {54  int *p1 = (int *)malloc(0);55  *p1 = 1; // no warn56}57 58//----- Test free standard new59void testFreeOpNew() {60  void *p = operator new(0);61  free(p);62  // mismatch-warning@-1{{Memory allocated by 'operator new' should be deallocated by 'delete', not 'free()'}}63}64 65void testFreeNewExpr() {66  int *p = new int;67  free(p);68  // mismatch-warning@-1{{Memory allocated by 'new' should be deallocated by 'delete', not 'free()'}}69  free(p);70}71 72void testObjcFreeNewed() {73  int *p = new int;74  NSData *nsdata = [NSData dataWithBytesNoCopy:p length:sizeof(int) freeWhenDone:1];75  // mismatch-warning@-1{{+dataWithBytesNoCopy:length:freeWhenDone: cannot take ownership of memory allocated by 'new'}}76}77 78void testFreeAfterDelete() {79  int *p = new int;80  delete p;81  free(p); // newdelete-warning{{Use of memory after it is released}}82}83 84void testStandardPlacementNewAfterDelete() {85  int *p = new int;86  delete p;87  p = new (p) int; // newdelete-warning{{Use of memory after it is released}}88}89