Jeffrey Walton wrote: > On Fri, Jun 7, 2019 at 2:37 PM Howard Chu <[email protected]> wrote: >> >> Jeffrey Walton wrote: >>> On Fri, Jun 7, 2019 at 10:08 AM Howard Chu <[email protected]> wrote: >>>> >>>> Jeffrey Walton wrote: >>>>> On Fri, Jun 7, 2019 at 9:59 AM Howard Chu <[email protected]> wrote: >>>>>> >>>>>> [email protected] wrote: >>>>>>> On Fri, Jun 7, 2019 at 9:32 AM Howard Chu <[email protected]> wrote: >>>>>>>> >>>>>>>> [email protected] wrote: >>>>>>>> ... >>>>>>>>> I encourage OpenLDAP to fix the undefined behavior. OpenLDAP is an >>>>>>>>> important project, and the undefined behavior is causing too many >>>>>>>>> tangential problems. >>>>>>>> >>>>>>>> Undefined behavior is not a bug, nor is it prohibited by the C spec. >>>>>>>> It is a necessary >>>>>>>> part of the language for its intended use as a system programming >>>>>>>> language, writing >>>>>>>> machine-specific programs. Anyone who says it is prohibited by the >>>>>>>> spec is wrong. >>>>>>> >>>>>>> I don't believe this is correct. >>>>>>> >>>>>>> Maybe you are thinking of implementation defined behavior? >>>>>> >>>>>> That would apply to how a particular compiler implementation treats some >>>>>> piece of code. >>>>>> Whether a CPU supports unaligned access is machine-defined. Since our >>>>>> code is already >>>>>> properly ifdef'd for the machines which do or don't support it, the fact >>>>>> that this is >>>>>> "non-portable" is not an issue. >>>>> >>>>> The undefined behavior is causing OpenLDAP to fail testing. >>>>> >>>>> Worse, it is causing test failures in programs and libraries which use >>>>> OpenLDAP. The OpenLDAP bugs have cross-pollinated into other programs >>>>> and libraries. It is not simply contained or limited to OpenLDAP. >>>>> >>>>> That's a big problem for testing a QA folks. >>>> >>>> Then the tests are broken, because these are not bugs. >>> >>> They are absolutely OpenLDAP bugs. The unaligned accesses are >>> Undefined Behavior. >> >> Simply because the C standard doesn't specify what the behavior is doesn't >> make it a bug. > > The C standard does specify the behavior. It falls clearly in > Undefined Behavior.
The fact a behavior is undefined does not make it illegal. > And Appendix J.2, Undefined Behavior, says: > > Conversion between two pointer types produces a result > that is incorrectly aligned (6.3.2.3). > > You are violating the C standard in macros like COPY_PGNO. Effectively > you are casting a uint8_t array to an uint16_t*. You cannot do that > because uint16_t* increases the alignment requirements. All internal fields of LMDB are (at least) 2-byte aligned, so these copies always meet alignment requirements. -- -- Howard Chu CTO, Symas Corp. http://www.symas.com Director, Highland Sun http://highlandsun.com/hyc/ Chief Architect, OpenLDAP http://www.openldap.org/project/
