blob: c12177a464c0c39d05e7251002483e0ef10ed399 [file]
/* Reduced from SoftEtherVPN's src/Cedar/WebUI.c. */
/* { dg-additional-options "-Wno-analyzer-symbol-too-complex" } */
#include "../../gcc.dg/analyzer/analyzer-decls.h"
typedef int (COMPARE)(void *p1, void *p2);
typedef unsigned int UINT;
typedef unsigned long int UINT64;
typedef struct LIST LIST;
typedef struct STRMAP_ENTRY STRMAP_ENTRY;
typedef struct WEBUI
{
/* [...snip...] */
LIST *Contexts;
} WEBUI;
typedef struct WU_CONTEXT
{
/* [...snip...] */
UINT64 ExpireDate;
} WU_CONTEXT;
struct LIST
{
/* [...snip...] */
UINT num_item, num_reserved;
void **p;
/* [...snip...] */
};
#define LIST_DATA(o, i) (((o) != NULL) ? ((o)->p[(i)]) : NULL)
#define LIST_NUM(o) (((o) != NULL) ? (o)->num_item : 0)
#ifdef __cplusplus
#ifndef _Bool
typedef bool _Bool;
#endif
#endif
struct STRMAP_ENTRY
{
char *Name;
void *Value;
};
void Free(void *addr);
void Add(LIST *o, void *p);
_Bool Delete(LIST *o, void *p);
void LockList(LIST *o);
void UnlockList(LIST *o);
void ReleaseList(LIST *o);
LIST *NewList(COMPARE *cmp);
UINT64 Tick64();
void WuFreeContext(WU_CONTEXT *context);
void WuExpireSessionKey(WEBUI *wu)
{
LIST *Expired = NewList(NULL);
UINT i;
LockList(wu->Contexts);
for(i=0; i<LIST_NUM(wu->Contexts); i++)
{
STRMAP_ENTRY *entry = (STRMAP_ENTRY*)LIST_DATA(wu->Contexts, i); /* { dg-bogus "'entry' is NULL" } */
WU_CONTEXT *context = (WU_CONTEXT*)entry->Value; /* { dg-bogus "dereference of NULL 'entry'" "PR analyzer/108400" } */
if(context->ExpireDate < Tick64())
{
Add(Expired, entry);
}
}
for(i=0; i<LIST_NUM(Expired); i++)
{
STRMAP_ENTRY *entry = (STRMAP_ENTRY*)LIST_DATA(Expired, i);
Delete(wu->Contexts, entry);
Free(entry->Name);
WuFreeContext((WU_CONTEXT*)entry->Value);
Free(entry);
}
ReleaseList(Expired);
UnlockList(wu->Contexts);
}