On Fri, Apr 4, 2014 at 6:07 AM, Laszlo Ersek <ler...@redhat.com> wrote:
> On 04/04/14 11:30, Reza Jelveh wrote:
>> On 04/04/14 02:14, Dong, Eric wrote:
>>> This error info is printed in CVfrCompiler::Compile () function.
>>> And before call this function, if vfrcompiler parse the code
>>> success, the status will be set to STATUS_PREPROCESSED, else it
>>> will be set to STATUS_DEAD. I don't think it's necessary to initial
>>> the value as STATUS_STARTED.
>
> Yes, it is necessary. See below.
>
>>>
>>> Also I'm curious what's the root cause for your error and does this patch 
>>> fix your error?
>>
>> Hey, sorry I just removed all my trace notes yesterday. As far as I remember
>> it never makes it to STATUS_INITIALIZED. I'm not sure what kind of bug that
>> is, because i tried both gcc 4.4 and 4.8 in archlinux. So it must be some
>> other environment based issue.
>>
>> Anyway, yes the patch fixes it. I found two other people having the same 
>> issue
>> here: https://aur.archlinux.org/packages/ovmf-svn/
>
> Reza, thank you for tracking this down; and indeed there's a bug in
> VfrCompiler.
>
> The problem is that the CVfrCompiler::mRunStatus member, a non-static,
> POD (plain old data) member, is not initialized. (COMPILER_RUN_STATUS is
> an enum type.)
>
> Hence in the following (otherwise successful) call chain, mRunStatus has
> indeterminate value, causing undefined behavior very early:
>
> CVfrCompiler::CVfrCompiler()
>   CVfrCompiler::OptionInitialization() // doesn't set mRunStatus
>   CVfrCompiler::IS_RUN_STATUS()
>     // reads mRunStatus
>
> Here's why CVfrCompiler::mRunStatus is not initialized, according to the
> C++03 standard (I could use a C++11 draft too, but I don't think
> BaseTools are built in C++11 mode):
>
> --------*--------
> 12     Special member functions
> 12.6   Initialization
> 12.6.2 Initializing bases and members
>
>   4  If a given nonstatic data member or base class is not named by a
>      mem-initializer-id (including the case where there is no
>      mem-initializer-list because the constructor has no
>      ctor-initializer), then
>
>      -- If the entity is a nonstatic data member of (possibly
>        cv-qualified) class type (or array thereof) or a base class, and
>        the entity class is a non-POD class, the entity is default-
>        initialized (8.5). If the entity is a nonstatic data member of a
>        const-qualified type, the entity class shall have a
>        user-declared default constructor.
>
>      -- Otherwise, the entity is not initialized. If the entity is of
>        const-qualified type or reference type, or of a (possibly
>        cv-qualified) POD class type (or array thereof) containing
>        (directly or indirectly) a member of a const-qualified type, the
>        program is ill-formed.
>
>      After the call to a constructor for class X has completed, if a
>      member of X is neither specified in the constructor's
>      mem-initializers, nor default-initialized, nor value-initialized,
>      nor given a value during execution of the body of the constructor,
>      the member has indeterminate value.
> --------*--------
>
> In this case:
> (a) CVfrCompiler::CVfrCompiler() is the constructor,
> (b) mRunStatus is a nonstatic data member,
> (c) the constructor has no ctor-initializer; ie. a member initializer
>     list, separated with a colon (:), as in
>
>     CVfrCompiler::CVfrCompiler (
>       IN INT32      Argc,
>       IN CHAR8      **Argv
>       ) : mRunStatus (STATUS_STARTED)
>     {
>       // ...
>     }
>
> (d) mRunStatus has an enumeration type, ie. a POD type; hence the
>     second bullet applies
> (e) The ill-formedness part of the 2nd bullet doesn't apply.
>
> (The program is not ill-formed, but the read access to mRunStatus is
> undefined.)
>
> I think that Reza's fix is correct, I'd just put the

Even if the fix is correct, the we can't do anything with it, since it
was not submitted with Contributed-under.

At the very least, Contributed-under is required, but an actual commit
message would be good too. :)

>   SET_RUN_STATUS (STATUS_STARTED);
>
> statement right at the top of the constructor, instead of pushing it
> down to CVfrCompiler::OptionInitialization().
>
> (Another possibility would be to use a ctor-initializer, like in (c)
> above, but I think that the BaseTools coding style doesn't allow that.)

Is it?

-Jordan

------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to