blob: 620cf6571edabc496e123ad9137acd6bba51cb65 [file] [log] [blame]
/* Reproducer for report from -Wanalyzer-malloc-leak
Reduced from
https://git.qemu.org/?p=qemu.git;a=blob;f=subprojects/libvhost-user/libvhost-user.c;h=fab7ca17ee1fb27bcfc338527d1aeb9f923aade5;hb=HEAD#l1184
which is licensed under GNU GPLv2 or later. */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint64_t;
typedef unsigned long uint64_t;
typedef long unsigned int size_t;
extern void *calloc(size_t __nmemb, size_t __size)
__attribute__((__nothrow__, __leaf__))
__attribute__((__malloc__))
__attribute__((__alloc_size__(1, 2)))
__attribute__((__warn_unused_result__));
typedef struct VuDescStateSplit {
uint8_t inflight;
uint64_t counter;
} VuDescStateSplit;
typedef struct VuVirtqInflight {
uint16_t desc_num;
VuDescStateSplit desc[];
} VuVirtqInflight;
typedef struct VuVirtqInflightDesc {
uint16_t index;
uint64_t counter;
} VuVirtqInflightDesc;
typedef struct VuVirtq {
VuVirtqInflight *inflight;
VuVirtqInflightDesc *resubmit_list;
uint16_t resubmit_num;
uint64_t counter;
int inuse;
} VuVirtq;
int vu_check_queue_inflights(VuVirtq *vq) {
int i = 0;
if (vq->inuse) {
vq->resubmit_list = calloc(vq->inuse, sizeof(VuVirtqInflightDesc));
if (!vq->resubmit_list) {
return -1;
}
for (i = 0; i < vq->inflight->desc_num; i++) {
if (vq->inflight->desc[i].inflight) {
vq->resubmit_list[vq->resubmit_num].index = i; /* { dg-bogus "leak" } */
vq->resubmit_list[vq->resubmit_num].counter =
vq->inflight->desc[i].counter;
vq->resubmit_num++;
}
}
}
return 0;
}