I think this is a bug; something somehow gets confused in the computations of the offsets/alignments and you end up reading/writing out-of-bounds memory. Could you open an issue or should someone else on this thread do so?
versioninfo()
#Julia Version 0.6.2
primitive type Int24 24 end
A=UInt8[i for i =1:12];
Ab=reinterpret(Int24, A)
#4-element Array{Int24,1}:
# Int24(0x030201)
# Int24(0x070605)
# Int24(0x0b0a09)
# Int24(0x000000) This is oob memory, potentially belonging to a different object.
unsafe_load(pointer(Ab,2))
#Int24(0x060504) correct
unsafe_load(pointer(Ab)+3)
#Int24(0x060504) correct
unsafe_load(pointer(Ab),2)
#Int24(0x070605) WRONG
Ab[2]
#Int24(0x070605) WRONG
Fixed on current master 0.7 (but a testcase would still be good, especially since @Keno plans to do something to reinterpret).
Edit: To be more precise, this issue has nothing to do with reinterpret and also happens on 0.7:
primitive type Int24 24 end
Int24(x::Int) = Core.Intrinsics.trunc_int(Int24, x)
Base.zero(::Type{Int24})=Int24(0)
A=zeros(Int24, 1000)
1000-element Array{Int24,1}:
#0.6:
# corrupted double-linked list
#signal (6): Aborted
#0.7:
#corrupted double-linked list
#signal (6): Aborted