RSS | technovelty home | page of ian | ian@wienand.org
If you poke around the Linux VM layers you might wonder why there
is a STRICT_MM_TYPECHECKS option. It is there to stop
programmers touching opaque types. Linus has said
many times that a typedef should only be made for a
completely opaque type. This therefore implies that rather than
operate on it directly, there is some sort of "API" to get at the
values.
A simple example is below. my_long_t is opaque; the
only way you should use its value is via the my_val
accessor.
But how do we enforce this, when the type is really just an
unsigned long? We wrap it up in something else, in this case a
struct.
#ifndef STRICT
typedef unsigned long my_long_t;
# define my_val(x) (x)
#else
typedef struct { unsigned long t; } my_long_t;
# define my_val(x) ((x).t)
#endif
my_long_t my_naughty_function(my_long_t input)
{
return input * 1000;
}
We can now see the outcome
$ gcc -c strict.c $ gcc -DSTRICT -c strict.c strict.c: In function 'my_naughty_function': strict.c:15: error: invalid operands to binary *
So now we have an error where we do the wrong thing, rather than no notification at all! This niftily moves you up from "bug via visual inspection" to "won't compile" (Rusty Russell talked about this scale at linux.conf.au once -- does anyone have a reference to that talk?). Why not just leave it like this then? Well it might confuse the compiler; if you have rules about always passing structures on the stack, for example, the above will suck. In general, it's best to hide as little from the compiler as possible, to give it the best chance of doing a good job for you.
posted at: Fri, 30 Jun 2006 13:35 | in /code/c | permalink | add comment (1 others)

This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.