Hi Adrian, On Sat, May 21, 2016 at 1:48 AM, Adrian Zubarev via swift-users <swift-users@swift.org> wrote: > I played around with UnsafeMutablePointer and realized one behavior: > > let pString = UnsafeMutablePointer<String>.alloc(1) > pString.initialize("test") > pString.predecessor().memory // will crash ax expected > pString.predecessor() == pString.advancedBy(-1) // true > pString.destroy() > pString.dealloc(1) > > where > > let iInt = UnsafeMutablePointer<String>.alloc(1) > iInt.initialize("test") > iInt.predecessor().memory // will not crash > iInt.predecessor() == iInt.advancedBy(-1) // true > iInt.predecessor().memory = 42 // did I just modified some memory I don't > own?
Yes, you did. In the String case the crash is not guaranteed (it is a segmentation fault, not a controlled trap). Someone else's valid String can happen to be located immediately before your memory chunk, and then the code would "just work", loading that other string. Dereferencing (reading or writing into) an out-of-bounds pointer is undefined behavior in Swift. Dmitri -- main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if (j){printf("%d\n",i);}}} /*Dmitri Gribenko <griboz...@gmail.com>*/ _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users