Are the critiques in "All the things I hate about Python" valid?

Terry Reedy tjreedy at udel.edu
Mon Feb 19 04:56:23 EST 2018


On 2/19/2018 4:14 AM, Chris Angelico wrote:
> On Mon, Feb 19, 2018 at 7:40 PM, Alain Ketterlin
> <alain at universite-de-strasbourg.fr.invalid> wrote:
>> Tim Delaney <timothy.c.delaney at gmail.com> writes:
>>> C is statically and weakly typed. Variables know their types at compile
>>> time (static typing). It is a feature of the language that you can cast any
>>> pointer to any chunk of memory to be a pointer to any other type (normally
>>> via void *). This is not coercion - it takes the bit pattern of memory of
>>> one type and interprets it as the bit pattern for another type, and is weak
>>> typing.
>>
>> No. C has much stronger rules, not on casting, but on accessing the
>> pointees, which basically invalidates your argument. Refer to the C
>> standard for details.
> 
> Really? What rules?
> 
> $ cat demo.c; gcc -Wall demo.c; ./a.out
> #include <stdio.h>
> 
> int main() {
>      float f = 3.14159;
>      int *i = (int *)&f;
>      printf("As an integer, %f is %d\n", f, *i);
>      return 0;
> }
> 
> As an integer, 3.141590 is 1078530000
> $
> 
> Looks to me like C is perfectly happy to interpret a float as an int.
> What rules are you seeing violated here?

The last time I tried, C was also willing to ints and arrays thereof as 
an array of chars. (I vaguely remember Fortran doing something like this 
also.  One Fortran int = four chars.)  The C memory model is a linear 
sequence of bytes, each consisting of at least 8 bits.  One means for 
malware attacks it is to disguise and insert binary code bytes as 
character bytes and then trick the CPU into executing the 'characters'.

-- 
Terry Jan Reedy




More information about the Python-list mailing list