[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#8988) Undefined Behavior in slapadd



Jeffrey Walton wrote:
> On Fri, Jun 7, 2019 at 2:37 PM Howard Chu <hyc@symas.com> wrote:
>>
>> Jeffrey Walton wrote:
>>> On Fri, Jun 7, 2019 at 10:08 AM Howard Chu <hyc@symas.com> wrote:
>>>>
>>>> Jeffrey Walton wrote:
>>>>> On Fri, Jun 7, 2019 at 9:59 AM Howard Chu <hyc@symas.com> wrote:
>>>>>>
>>>>>> noloader@gmail.com wrote:
>>>>>>> On Fri, Jun 7, 2019 at 9:32 AM Howard Chu <hyc@symas.com> wrote:
>>>>>>>>
>>>>>>>> noloader@gmail.com 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/