Re: Large writable variables
Andres Freund <andres@anarazel.de>
On 2018-10-16 11:22:31 -0400, Robert Haas wrote: > On Tue, Oct 16, 2018 at 2:30 AM Andres Freund <andres@anarazel.de> wrote: > > This just reminded me that a couple times I wanted a cast that casts > > away const, but otherwise makes sure the type stays the same. I don't > > think there's a way to do that in C, but we can write one that verifies > > the cast doesn't do something bad if gcc is used: > > > > #if defined(HAVE__BUILTIN_TYPES_COMPATIBLE_P) > > #define unconstify(cst, var) StaticAssertExpr(__builtin_types_compatible_p(__typeof(var), const cst), "wrong cast"), (cst) (var) > > #else > > #define unconstify(cst, var) ((cst) (var)) > > #endif > > > > Does anybody besides me see value in adding a cleaned up version of > > that? > > Under what circumstances would we consider this to be a legitimate thing to use? When the variable actually *will not* be modified, but language or API design reasons makes it unfeasiable to express that. Look e.g. DestReceiver * CreateDestReceiver(CommandDest dest); some of the returned receivers (e.g. donothingDR, printsimpleDR) are statically allocated and *any* modification would be a bug. But other return values will be modified, e.g. CreateIntoRelDestReceiver(). It's safe to cast constness away if the variable will not actually be modified after. Which is e.g. the case above. But making the static allocations const will a) save memory b) trigger sigbuses if you modify them. So the casting constness away here *increases* robustness. The problem is that just adding a cast like case DestNone: return (DestReceiver *) &donothingDR; also hides errors. If you e.g. changed the type of donothingDR you'd still not get an error. So I was wishing for a form of a cast that only casts the const away, but errors out if there's any other type difference. That's the above, I think. > I think if we add something this, we'd better accompany it with some > detailed and very clearly-written statements about when you're allowed > to use it. Otherwise, I predict that people will use it in cases > where it's not actually safe, and we'll end up with low-grade bugs. Well, right now people will (and have) just cast the const away like above. So I don't really see it being more likely to cause problems than we're doing now. But yea, it definitely should have a big red warning label. Greetings, Andres Freund
Commits
-
Apply unconstify() in more places
- 0a8590b2a09e 12.0 landed
-
Improve unconstify() documentation
- f2898de98a54 12.0 landed
-
Drop const cast from dlsym() calls
- e6f5d1accd3a 12.0 landed
-
Const-ify a few more large static tables.
- 48d818ede15b 12.0 landed
-
Improve tzparse's handling of TZDEFRULES ("posixrules") zone data.
- fb38d9a2e1ed 9.5.15 landed
- ec5fe7f799a4 9.4.20 landed
- e7eb07f70951 12.0 landed
- db4f9c0258be 11.1 landed
- c776cd47245a 9.3.25 landed
- 312f632005f3 10.6 landed
- 1164389e12b0 9.6.11 landed
-
Avoid statically allocating statement cache in ecpglib/prepare.c.
- e15aae829e3e 12.0 landed
-
Reorder FmgrBuiltin members, saving 25% in size.
- 28d750c0cd5b 12.0 landed
-
Add macro to cast away const without allowing changes to underlying type.
- d1211c63f010 12.0 landed
-
Mark constantly allocated dest receiver as const.
- 93ca02e00560 12.0 landed
-
Avoid statically allocating formatting.c's format string caches.
- fd85e9f78d44 12.0 landed
-
Correct constness of system attributes in heap.c & prerequisites.
- 02a30a09f9e5 12.0 landed
-
Avoid statically allocating gmtsub()'s timezone workspace.
- baa94ebe2cc8 9.3.25 landed
- 5ef71d4bd322 9.6.11 landed
- 27ba589b745f 9.4.20 landed
- 18c725413fad 9.5.15 landed
- d64a54fb9c81 10.6 landed
- d11268237378 11.1 landed
- 3dfef0c519de 12.0 landed
-
Correct constness of a few variables.
- 62649bad831f 12.0 landed
-
Move the replication lag tracker into heap memory.
- e73ca79fc78d 12.0 landed