<p>Am 20.01.2016 10:03 schrieb "Pierce Ng" <<a href="mailto:pierce@samadhiweb.com">pierce@samadhiweb.com</a>>:<br>
><br>
> Hi all,<br>
><br>
> I last used Pascal in school a long long time ago. Just discovered Free Pascal.<br>
><br>
> I have the following:<br>
><br>
>   type<br>
>     TNonceBytes = array[1..8] of byte;<br>
><br>
>     TNonce = class<br>
>       private<br>
>         pn: TNonceBytes;<br>
>         filled: boolean;<br>
>       public<br>
>         constructor create; overload;<br>
>       end;<br>
><br>
>   constructor TNonce.create;<br>
>   begin<br>
>     inherited;<br>
>     randombytes(pn, 8);<br>
>     filled := true;<br>
>   end;<br>
><br>
> Is "filled" necessary, or does the compiler guarantee that my overloaded<br>
> constructor is called to fill "pn" with "real crypto" random bytes?</p>
<p>Note: "overload" is only necessary if you have multiple methods of the same name with different parameters. What you probably meant is "override", but even that is only necessary if a method in the parent was declared as "virtual". For constructors this isn't normally necessary, except if you want to use class variables to instantiate the class. E.g.</p>
<p>=== code begin ===</p>
<p>type<br>
  TNonceClass = class of TNonce;</p>
<p>var<br>
  c: TNonceClass;<br>
  o: TNonce;<br>
begin<br>
  c := TSomeSubNonce;<br>
  o := c.Create;<br>
end.</p>
<p>=== code end ===</p>
<p>In this example if the constructor in TNonce isn't declared as virtual (and the on in TSomeSubNonce not as override) the TNonce.Create will be called, otherwise TSomeSubNonce will be called.</p>
<p>>  I'd imagine<br>
> that, if randombytes() isn't called, the content of pn might be whatever that<br>
> happens to be in the memory that was allocated. By eyeballing, I won't be able<br>
> to tell, but cryptographically it'll be catastrophic if pn contains<br>
> random-looking but possibly predictable data.<br>
><br>
> On a related note, if I keep "filled" as an instance variable but leave the<br>
> line "filled := true" out from the constructor, what is filled's value<br>
> after the constructor is done?</p>
<p>The memory area of a class instance is by default always initialized with 0s. So in this case "pn" will contain zeroes and "filled" will be "false".<br>
Sidenote: Strings will be '', objects, interfaces and dynamic arrays will be Nil.</p>
<p>><br>
> Finally, remembering my programming languages course from my CS undergrad days,<br>
> in the following, are TNonce and TNonceBytes allocated on the stack or from the<br>
> heap, and should I care, given that, in this case, I am writing a<br>
> security-sensitive program?<br>
><br>
>   procedure encrypt(ptext: TByteArray, var ctext: TByteArray);<br>
>   var<br>
>     n: TNonce;<br>
>   begin<br>
>     n := TNonce.create;<br>
>     ... whatever ...<br>
>   end;</p>
<p>Classes are *always* allocated on the heap. If you want to control whether something is allocated on the stack or the heap you need to use records or the Turbo Pascal-style objects.</p>
<p>I can't answer your question regarding the security-sensitivity though.</p>
<p>Regards,<br>
Sven</p>