1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 09:27:59 +00:00

Switch sresize to using TYPECHECK.

Now that that facility is centralised in defs.h, there's no reason to
have a special ad-hoc version in sresize and separately comment it.
This commit is contained in:
Simon Tatham 2019-01-03 10:51:52 +00:00
parent f081885bc0
commit f2174536a8

View File

@ -22,23 +22,16 @@ void safefree(void *);
/*
* Direct use of smalloc within the code should be avoided where
* possible, in favour of these type-casting macros which ensure
* you don't mistakenly allocate enough space for one sort of
* structure and assign it to a different sort of pointer.
*
* The nasty trick in sresize with sizeof arranges for the compiler,
* in passing, to type-check the expression ((type *)0 == (ptr)), i.e.
* to type-check that the input pointer is a pointer to the correct
* type. The construction sizeof(stuff) ? (b) : (b) looks like a
* violation of the first principle of safe macros, but in fact it's
* OK - although it _expands_ the macro parameter more than once, it
* only _evaluates_ it once, so it's still side-effect safe.
* possible, in favour of these type-casting macros which ensure you
* don't mistakenly allocate enough space for one sort of structure
* and assign it to a different sort of pointer. sresize also uses
* TYPECHECK to verify that the _input_ pointer is a pointer to the
* correct type.
*/
#define snew(type) ((type *)snmalloc(1, sizeof(type)))
#define snewn(n, type) ((type *)snmalloc((n), sizeof(type)))
#define sresize(ptr, n, type) \
((type *)snrealloc(sizeof((type *)0 == (ptr)) ? (ptr) : (ptr), \
(n), sizeof(type)))
#define sresize(ptr, n, type) TYPECHECK((type *)0 == (ptr), \
((type *)snrealloc((ptr), (n), sizeof(type))))
/*
* For cases where you want to allocate a struct plus a subsidiary