During the development cycle of the 3.8 release, changes were made to the codice_12 memory management functions. In traditional Unix operating systems, codice_12 allocates more memory by extending the Unix data segment, a practice that has made it difficult to implement strong protection against security problems. The codice_12 implementation now in OpenBSD makes use of the codice_15 system call, which was modified so that it returns random memory addresses and ensures that different areas are not mapped next to each other. In addition, allocation of small blocks in shared areas are now randomized and the codice_16 function was changed to return memory to the kernel immediately rather than leaving it mapped into the process. A number of additional, optional checks were also added to aid in development. These features make program bugs easier to detect and harder to exploit: instead of memory being corrupted or an invalid access being ignored, they often result in a segmentation fault and abortion of the process. This has brought to light several issues with software running on OpenBSD 3.8, particularly with programs reading beyond the start or end of a buffer, a type of bug that would previously not be detected directly but can now cause an error. These abilities took more than three years to implement without considerable performance loss.