Use flexible array members for structs that end with var-sized arrays

- Since Clang++, G++, and VC++ all support this extension (even though it's
  technically officially only part of C99), use it. It lets Clang's array-
  bounds checker know that these are meant to be accessed out of their so-called
  "bounds".
This commit is contained in:
Randy Heit 2014-04-03 16:28:29 -05:00
parent fbddfbe576
commit 43fe317dbe
4 changed files with 7 additions and 7 deletions

View file

@ -558,8 +558,8 @@ static visplane_t *new_visplane (unsigned hash)
if (check == NULL) if (check == NULL)
{ {
check = (visplane_t *)M_Malloc (sizeof(*check) + sizeof(*check->top)*(MAXWIDTH*2)); check = (visplane_t *)M_Malloc (sizeof(*check) + 3 + sizeof(*check->top)*(MAXWIDTH*2));
memset(check, 0, sizeof(*check) + sizeof(*check->top)*(MAXWIDTH*2)); memset(check, 0, sizeof(*check) + 3 + sizeof(*check->top)*(MAXWIDTH*2));
check->bottom = check->top + MAXWIDTH+2; check->bottom = check->top + MAXWIDTH+2;
} }
else if (NULL == (freetail = freetail->next)) else if (NULL == (freetail = freetail->next))

View file

@ -63,7 +63,7 @@ struct visplane_s
unsigned short *bottom; // [RH] bottom and top arrays are dynamically unsigned short *bottom; // [RH] bottom and top arrays are dynamically
unsigned short pad; // allocated immediately after the unsigned short pad; // allocated immediately after the
unsigned short top[3]; // visplane. unsigned short top[]; // visplane.
}; };
typedef struct visplane_s visplane_t; typedef struct visplane_s visplane_t;

View file

@ -55,7 +55,7 @@ struct FStringTable::StringEntry
StringEntry *Next; StringEntry *Next;
char *Name; char *Name;
BYTE PassNum; BYTE PassNum;
char String[2]; char String[];
}; };
FStringTable::FStringTable () FStringTable::FStringTable ()
@ -283,7 +283,7 @@ void FStringTable::LoadLanguage (int lumpnum, DWORD code, bool exactMatch, int p
} }
if (entry == NULL || cmpval > 0) if (entry == NULL || cmpval > 0)
{ {
entry = (StringEntry *)M_Malloc (sizeof(*entry) + strText.Len() + strName.Len()); entry = (StringEntry *)M_Malloc (sizeof(*entry) + strText.Len() + strName.Len() + 2);
entry->Next = *pentry; entry->Next = *pentry;
*pentry = entry; *pentry = entry;
strcpy (entry->String, strText.GetChars()); strcpy (entry->String, strText.GetChars());
@ -409,7 +409,7 @@ void FStringTable::SetString (const char *name, const char *newString)
size_t namelen = strlen (name); size_t namelen = strlen (name);
// Create a new string entry // Create a new string entry
StringEntry *entry = (StringEntry *)M_Malloc (sizeof(*entry) + newlen + namelen); StringEntry *entry = (StringEntry *)M_Malloc (sizeof(*entry) + newlen + namelen + 2);
strcpy (entry->String, newString); strcpy (entry->String, newString);
strcpy (entry->Name = entry->String + newlen + 1, name); strcpy (entry->Name = entry->String + newlen + 1, name);
entry->PassNum = 0; entry->PassNum = 0;

View file

@ -119,7 +119,7 @@ struct patch_t
SWORD height; SWORD height;
SWORD leftoffset; // pixels to the left of origin SWORD leftoffset; // pixels to the left of origin
SWORD topoffset; // pixels below the origin SWORD topoffset; // pixels below the origin
DWORD columnofs[8]; // only [width] used DWORD columnofs[]; // only [width] used
// the [0] is &columnofs[width] // the [0] is &columnofs[width]
}; };