On 18/05/2017 19:50, Chris Angelico wrote:

Now this, however, is more serious. Those warnings scare me, too. (I
just tried it.) Instead of being "gcc is noisy", these are "your code
is sloppy". These are exactly why I tell most people NOT to write in
C. For machine-generated code, this is IMO unacceptable. Maybe
"-Wno-unused" is okay (machine-generated code often has some junk in
it), but all the uninitialized variables? No way. Doesn't matter what
compiler you use, run it in all-warnings-enabled mode at least once as
part of testing your codegen.

The rules are different when you are writing in a different language and only use a C compiler to compile the intermediate code.

Before it becomes C, the code has already been largely verified. C might still pick up some things, if the first compiler doesn't check them.

But C is dominated by its ideas of what is undefined behaviour and what is implementation defined, which don't match the model used in the original language. That language might only be designed for a small set of architectures where everything is well defined, whereas C is expected to run on every conceivable architecture ever devised.

So the original language can decide that converting a 64-bit pointer (to 'void') to a 64-bit function pointer is fine, provided there is a cast. But C might not like it because on some obscure machine, function pointers work differently. You need to do a lot of work to shut up the compiler (and it still won't work on that obscure machine).

Bear in mind C allows you to do this:

int *A[10];    // array of pointers to int
int (*B)[10];  // pointer to array of int
int i;

*A[i];         // index then deref to get the int
(*B)[i];       // deref then index to get the int

That's fine so far: one is an array of pointers, other is a pointer to an array. However, you can also do this:

(*A)[i];       // deref an array then index
*B[i];         // index a pointer then deref

which is wrong, and can crash the program. A compiler however will not detect it as it is perfectly legal, meanwhile it will deluge you with hundreds of pointless warnings.

In my original language, such a mixup is illegal. So, do you still trust a C compiler more? The language is inherently unsafe.

--
bartc
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to