From: <pv...@pv...> - 2005-08-18 18:46:41
|
SBCL/Sparc throws a bus Error when it tried to dereference unaligned pointers. From http://docs.sun.com/app/docs/doc/802-5900/6i9kj7ood?a=view -----8<----- All quantities must be aligned on their natural boundaries. Using standard C data types: * short integers are aligned on 16-bit boundaries. * int integers are aligned on 32-bit boundaries. * long integers are aligned on either 32-bit boundaries or 64-bit boundaries, depending on whether the data model of the kernel is 64-bit or 32-bit. For information on data models, see Appendix F, "Making a Device Driver 64-Bit Ready". * long long integers are aligned on 64-bit boundaries. -----8<----- The problem is that SBCL allows casts to alien-types with stricter alignment requirements without any warning, and that DEREF does not check for alignment, even with normal OPTIMIZE settings. There are two issues here: 1. The programmer shouldn't upcast. 2. SBCL allows this without emitting any warning, trying to emit a more meaningful error than "Bus error" or defaulting to a slower byte-by-byte access on unaligned addresses. The first point is hard to fix, especially after the fact. It wouldn't be strictly legal in C (it'd probably elicit a warning from the compiler), but it's perfectly legal on CISCy architectures. Also, it makes some things incredibly painful (extracting the data byte by byte from CL). That's why I don't think simply emitting an error on unaligned accesses (where applicable) is an acceptable solution. Does anyone else see a better solution than providing finer-grained access routines, along with a style warning on upcasts? Thank you, Paul Khuong |