On Thu, May 25, 2017 at 9:34 AM, bartc <b...@freeuk.com> wrote:
> That was quite likely with older Fortrans, where subroutines only used
> pass-by-reference, but which didn't stop you passing references to constants
> that the subroutine could then modify.
>
> I doubt that's still the case. With C, however, I tried this today:
>
>   "abcdef"[3] = 'z';
>   puts("abcdef");
>
> Some versions crashed; some printed 'abczef', and some 'abcdef'. (The
> language says this is undefined, but it doesn't try too hard to stop you
> doing it.)

And why should they try to stop you? The whole point of undefined
behaviour is that you shouldn't be doing this, so if you do, the
interpreter's allowed to do anything.

# Lifted from reddit: change the value of 29 to be 100
import ctypes
def deref(addr, typ):
    return ctypes.cast(addr, ctypes.POINTER(typ))
deref(id(29), ctypes.c_int)[6] = 100

print(29)
x = 29
y = x + 1
print(y - 1)

What's going to happen? Will it print 100 twice? What is y? The
behaviour of CPython after you mess around with ctypes like this is as
undefined as any of C's weirdnesses.

And yes, Steve, this is a challenge to you: if you think C's undefined
behaviour is an abomination that should not be allowed to exist,
define what Python should do here.

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

Reply via email to