On 2/19/2018 4:14 AM, Chris Angelico wrote:
On Mon, Feb 19, 2018 at 7:40 PM, Alain Ketterlin
<al...@universite-de-strasbourg.fr.invalid> wrote:
Tim Delaney <timothy.c.dela...@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

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


Reply via email to