[Lazarus] Improper initialization of manged types
Sean O'Connor
capricorn8159 at gmail.com
Tue Jul 9 20:53:46 CEST 2013
while not being an experienced programmer myself, one thing does spring
to mind. so apologies if if I am mistaken. but it does seem possible
that the compiler migvht be compiling to 64 bit as opposed to 32 bit.. I
hope that helps somewhat but i am sure others with greater knowledge
than I will probably suggest other, equyally helpfull solutions.
On 09/07/2013 18:55, Anthony Walter wrote:
> Problem: Free Pascal is not properly initializing and finalizing an
> interface type resulting in code being invoked for a garbage pointer.
> The error is highlighted at the end.
>
> Previously I filed a bug report on this issue and received feedback
> that the bug could not be reproduced, but it's hitting me me big time
> when building on 32-bit Linux (I been working on 64-bit Linux withe
> same same compiler source without these problems). I'd like to post
> some code and get feedback on how to fix this problem, if it is either
> something I am doing or a problem with the compiler.
>
> I have an interface type, what I would call a managed type since the
> compiler ought to generate code to initialize and finalize its value,
> which is used to share 1 or more contiguous floats:
>
> IDependencyProperty = interface
> ['{E021AD95-9985-48AB-B29F-8D25A7BBE10E}']
> function GetCount: Integer;
> function GetValue(Index: Integer): Float;
> procedure SetValue(Value: Float; Index: Integer);
> property Count: Integer read GetCount;
> end;
>
> The interface is exposed by records TVec(n)Prop where n represents the
> count or available floats. These properties are used to share float
> vectors with animations/storyboards or other objects. Here is an the
> listing of TVec1Prop:
>
> TVec1Prop = record
> private
> function GetValue: TVec1;
> procedure SetValue(Value: TVec1);
> function GetVec(Index: Integer): TVec1Prop;
> procedure SetVec(Index: Integer; const Value: TVec1Prop);
> public
> class operator Implicit(const Value: TVec1): TVec1Prop;
> class operator Implicit(const Value: TVec1Prop): TVec1;
> class operator Negative(const A: TVec1Prop): TVec1;
> class operator Positive(const A: TVec1Prop): TVec1;
> class operator Equal(const A, B: TVec1Prop) : Boolean;
> class operator NotEqual(const A, B: TVec1Prop): Boolean;
> class operator GreaterThan(const A, B: TVec1Prop): Boolean;
> class operator GreaterThanOrEqual(const A, B: TVec1Prop): Boolean;
> class operator LessThan(const A, B: TVec1Prop): Boolean;
> class operator LessThanOrEqual(const A, B: TVec1Prop): Boolean;
> class operator Add(const A, B: TVec1Prop): TVec1;
> class operator Subtract(const A, B: TVec1Prop): TVec1;
> class operator Multiply(const A, B: TVec1Prop): TVec1;
> class operator Divide(const A, B: TVec1Prop): TVec1;
> procedure Link(OnChange: TDependencyChangeNotify = nil); overload;
> procedure Link(Prop: IDependencyProperty; Index: LongInt); overload;
> procedure Unlink;
> function Linked: Boolean;
> function Equals(const A: TVec1Prop): Boolean;
> function Same(const A: TVec1Prop): Boolean;
> property X: TVec1Prop index 0 read GetVec write SetVec;
> property Value: TVec1 read GetValue write SetValue;
> property Vec[Index: Integer]: TVec1Prop read GetVec write SetVec;
> private
> FProp: IDependencyProperty;
> case Boolean of
> True: (FIndex: LongInt);
> False: (FValue: TVec1);
> end;
>
> Part of the implementation looks like this with an example of the
> ERROR in comments:
>
> { TVec1Prop }
>
> class operator TVec1Prop.Implicit(const Value: TVec1Prop): TVec1;
> begin
> Result := Value.Value;
> end;
>
> class operator TVec1Prop.Implicit(const Value: TVec1): TVec1Prop;
> begin
> // ERROR: WriteLn(UIntPtr(Result.FProp)); writes out a random memory
> location
> // ERROR: Result.FProp should be nil already but it is not
> Result.FProp := nil; // ERROR: Code is generated which attempts to
> call release on random garbage
> Result.FIndex := 0;
> Result.FValue := Value;
> end;
>
> function TVec1Prop.GetValue: TVec1;
> begin
> if FProp = nil then
> Result := FValue
> else
> Result := FProp.GetValue(FIndex);
> end;
>
> procedure TVec1Prop.SetValue(Value: TVec1);
> begin
> if FProp = nil then
> FValue := Value
> else
> FProp.SetValue(Value, FIndex);
> end;
>
> The problem is happening in a lot of places which use my TVec(n)Prop
> types, resulting in many AV errors, but again only when I am
> recompiling my demo programs on 32-bit Linux (with the same compiler
> source). For example I have a list of TVec1Prop, when I clear the list
> I am getting AV errors due to some items not being finalized correctly.
>
> What should I do?
>
>
> --
> _______________________________________________
> Lazarus mailing list
> Lazarus at lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20130709/53ed3ce6/attachment-0003.html>
More information about the Lazarus
mailing list