Sorry; zeros() does not work here instead of new().  My mistake.
Is there a safe alternative to new() that guarantees that all fields
will have a definite fixed value?

Cheers,
Ron

On Tuesday, November 25, 2014 1:05:40 AM UTC-5, Ronald L. Rivest wrote:
>
> The problem also exists for new() (e.g. when initializing a 
> record/object).  zeros() can
> apparently be used here instead.
>
> Cheers,
> Ron
>
> On Tuesday, November 25, 2014 12:29:07 AM UTC-5, Viral Shah wrote:
>>
>> Much has been already said on this topic. 
>>
>> The Array(...) interface was kind of meant to be low-level for the user 
>> of scientific computing, only to be used when they know what they are 
>> doing. You get the raw uninitialized memory as fast as possible.
>>
>> The user-facing interface was always an array constructor - zeros(), 
>> ones(), rand(), etc. Some of this is because of our past experience coming 
>> from a matlab/R-like world. 
>>
>> As Julia has become more popular, we have realized that those not coming 
>> from matlab/R end up using all the possible constructors. While this has 
>> raised a variety of issues, I'd like to say that this will not get sorted 
>> out satisfactorily before the 0.4 release. For a class that may be taught 
>> soon, the thing to do would be to use the zeros/ones/rand constructors to 
>> construct arrays, instead of Array(), which currently is more for a package 
>> developer. I understand that Array() is a much better name as Stefan points 
>> out, but zeros() is not too terrible - it at least clearly tells the user 
>> that they get zeroed out arrays.
>>
>> While we have other "features" that can lead to unsafe code (ccall, 
>> @inbounds), none of these are things one is likely to run into while 
>> learning the language.
>>
>> -viral
>>
>> On Tuesday, November 25, 2014 1:00:10 AM UTC+5:30, Ronald L. Rivest wrote:
>>>
>>> Regarding initialization:
>>>
>>>    -- I'm toying with the idea of recommending Julia for an introductory 
>>> programming
>>>       class (rather than Python).  
>>>
>>>    -- For this purpose, the language should not have hazards that catch 
>>> the unwary.
>>>
>>>    -- Not initializing storage is definitely a hazard.  With 
>>> uninitialized storage, a 
>>>       program may run fine one day, and fail mysteriously the next, 
>>> depending on 
>>>       the contents of memory.  This is about predictability, 
>>> reliability, dependability,
>>>       and correctness.
>>>
>>>    -- I would favor a solution like
>>>              A = Array(Int64,n)                   -- fills with zeros
>>>              A = Array(Int64,n,fill=1)          -- to fill with ones
>>>              A = Array(Int64,n,fill=None)    -- for an uninitialized 
>>> array
>>>        so that the *default* is an initialized array, but the speed geeks
>>>        can get what they want.
>>>
>>> Cheers,
>>> Ron
>>>
>>> On Monday, November 24, 2014 1:57:14 PM UTC-5, Stefan Karpinski wrote:
>>>>
>>>> If we can make allocating zeroed arrays faster that's great, but unless 
>>>> we can close the performance gap all the way and eliminate the need to 
>>>> allocated uninitialized arrays altogether, this proposal is just a rename 
>>>> – Unchecked.Array 
>>>> plays the exact same role as the current Array constructor. It's 
>>>> unclear that this would even address the original concern since it still 
>>>> *allows* uninitialized allocation of arrays. This rename would just force 
>>>> people who have used Array correctly in code that cares about being as 
>>>> efficient as possible even for very large arrays to change their code and 
>>>> use Unchecked.Array instead.
>>>>
>>>> On Nov 24, 2014, at 1:36 PM, Jameson Nash <vtj...@gmail.com> wrote:
>>>>
>>>> I think that Rivest’s question may be a good reason to rethink the 
>>>> initialization of structs and offer the explicit guarantee that all 
>>>> unassigned elements will be initialized to 0 (and not just the jl_value_t 
>>>> pointers). I would argue that the current behavior resulted more from a 
>>>> desire to avoid clearing the array twice (if the user is about to call 
>>>> fill, zeros, ones, +, etc.) than an intentional, casual exposure of 
>>>> uninitialized memory.
>>>>
>>>> A random array of integers is also a security concern if an attacker 
>>>> can extract some other information (with some probability) about the state 
>>>> of the program. Julia is not hardened by design, so you can’t safely run 
>>>> an 
>>>> unknown code fragment, but you still might have an unintended memory 
>>>> exposure in a client-facing app. While zero’ing memory doesn’t prevent the 
>>>> user from simply reusing a memory buffer in a security-unaware fashion 
>>>> (rather than consistently allocating a new one for each use), it’s not 
>>>> clear to me that the performance penalty would be all that noticeable for 
>>>> map Array(X) to zero(X), and only providing an internal constructor for 
>>>> grabbing uninitialized memory (perhaps Base.Unchecked.Array(X) from 
>>>> #8227)
>>>>
>>>> On Mon Nov 24 2014 at 12:57:22 PM Stefan Karpinski 
>>>> stefan.karpin...@gmail.com <http://mailto:stefan.karpin...@gmail.com> 
>>>> wrote:
>>>>
>>>> There are two rather different issues to consider:
>>>>>
>>>>> 1. Preventing problems due to inadvertent programmer errors.
>>>>> 2. Preventing malicious security attacks.
>>>>>
>>>>> When we initially made this choice, it wasn't clear if 1 would be a 
>>>>> big issue but we decided to see how it played out. It hasn't been a 
>>>>> problem 
>>>>> in practice: once people grok that the Array(T, dims...) constructor 
>>>>> gives 
>>>>> uninitialized memory and that the standard usage pattern is to call it 
>>>>> and 
>>>>> then immediately initialize the memory, everything is ok. I can't 
>>>>> recall a single situation where someone has had some terrible bug due to 
>>>>> uninitialized int/float arrays.
>>>>>
>>>>> Regarding 2, Julia is not intended to be a hardened language for 
>>>>> writing highly secure software. It allows all sorts of unsafe actions: 
>>>>> pointer arithmetic, direct memory access, calling arbitrary C functions, 
>>>>> etc. The future of really secure software seems to be small formally 
>>>>> verified kernels written in statically typed languages that communicate 
>>>>> with larger unverified systems over restricted channels. Julia might be 
>>>>> appropriate for the larger unverified system but certainly not for the 
>>>>> trusted kernel. Adding enough verification to Julia to write secure 
>>>>> kernels 
>>>>> is not inconceivable, but would be a major research effort. The 
>>>>> implementation would have to check lots of things, including, of course, 
>>>>> ensuring that all arrays are initialized.
>>>>>
>>>>> A couple of other points:
>>>>>
>>>>> Modern OSes protect against data leaking between processes by zeroing 
>>>>> pages before a process first accesses them. Thus any data exposed by 
>>>>> Array(T, dims...) comes from the same process and is not a security leak.
>>>>>
>>>>> An uninitialized array of, say, integers is not in itself a security 
>>>>> concern – the issue is what you do with those integers. The classic 
>>>>> security hole is to use a "random" value from uninitialized memory to 
>>>>> access other memory by using it to index into an array or otherwise 
>>>>> convert 
>>>>> it to a pointer. In the presence of bounds checking, however, this isn't 
>>>>> actually a big concern since you will still either get a bounds error or 
>>>>> a 
>>>>> valid array value – not a meaningful one, of course, but still just a 
>>>>> value.
>>>>>
>>>>> Writing programs that are secure against malicious attacks is a hard, 
>>>>> unsolved problem. So is doing efficient, productive high-level numerical 
>>>>> programming. Trying to solve both problems at the same time seems like a 
>>>>> recipe for failing at both.
>>>>>
>>>>> On Nov 24, 2014, at 11:43 AM, David Smith <david...@gmail.com> wrote:
>>>>>
>>>>> Some ideas:
>>>>>
>>>>> Is there a way to return an error for accesses before at least one 
>>>>> assignment in bits types?  I.e. when the object is created uninitialized 
>>>>> it 
>>>>> is marked "dirty" and only after assignment of some user values can it be 
>>>>> "cleanly" accessed?
>>>>>
>>>>> Can Julia provide a thin memory management layer that grabs memory 
>>>>> from the OS first, zeroes it, and then gives it to the user upon initial 
>>>>> allocation?  After gc+reallocation it doesn't need to be zeroed again, 
>>>>> unless the next allocation is larger than anything previous, at which 
>>>>> time 
>>>>> Julia grabs more memory, sanitizes it, and hands it off. 
>>>>>
>>>>> On Monday, November 24, 2014 2:48:05 AM UTC-6, Mauro wrote:
>>>>>>
>>>>>> Pointer types will initialise to undef and any operation on them 
>>>>>> fails: 
>>>>>> julia> a = Array(ASCIIString, 5); 
>>>>>>
>>>>>> julia> a[1] 
>>>>>> ERROR: access to undefined reference 
>>>>>>  in getindex at array.jl:246 
>>>>>>
>>>>>> But you're right, for bits-types this is not an error an will just 
>>>>>> return whatever was there before.  I think the reason this will stay 
>>>>>> that way is that Julia is a numerics oriented language.  Thus you 
>>>>>> many 
>>>>>> wanna create a 1GB array of Float64 and then fill it with something 
>>>>>> as 
>>>>>> opposed to first fill it with zeros and then fill it with something. 
>>>>>> See: 
>>>>>>
>>>>>> julia> @time b = Array(Float64, 10^9); 
>>>>>> elapsed time: 0.029523638 seconds (8000000144 bytes allocated) 
>>>>>>
>>>>>> julia> @time c = zeros(Float64, 10^9); 
>>>>>> elapsed time: 0.835062841 seconds (8000000168 bytes allocated) 
>>>>>>
>>>>>> You can argue that the time gain isn't worth the risk but I suspect 
>>>>>> that 
>>>>>> others may feel different. 
>>>>>>
>>>>>> On Mon, 2014-11-24 at 09:28, Ronald L. Rivest <rives...@gmail.com> 
>>>>>> wrote: 
>>>>>> > I am just learning Julia... 
>>>>>> > 
>>>>>> > I was quite shocked today to learn that Julia does *not* 
>>>>>> > initialize allocated storage (e.g. to 0 or some default value). 
>>>>>> > E.g. the code 
>>>>>> >      A = Array(Int64,5) 
>>>>>> >      println(A[1]) 
>>>>>> > has unpredictable behavior, may disclose information from 
>>>>>> > other modules, etc. 
>>>>>> > 
>>>>>> > This is really quite unacceptable in a modern programming 
>>>>>> > language; it is as bad as not checking array reads for 
>>>>>> out-of-bounds 
>>>>>> > indices.   
>>>>>> > 
>>>>>> > Google for "uninitialized security" to find numerous instances 
>>>>>> > of security violations and unreliability problems caused by the 
>>>>>> > use of uninitialized variables, and numerous security advisories 
>>>>>> > warning of problems caused by the (perhaps inadvertent) use 
>>>>>> > of uninitialized variables. 
>>>>>> > 
>>>>>> > You can't design a programming language today under the naive 
>>>>>> > assumption that code in that language won't be used in highly 
>>>>>> > critical applications or won't be under adversarial attack. 
>>>>>> > 
>>>>>> > You can't reasonably ask all programmers to properly initialize 
>>>>>> > their allocated storage manually any more than you can ask them 
>>>>>> > to test all indices before accessing an array manually; these are 
>>>>>> > things that a high-level language should do for you. 
>>>>>> > 
>>>>>> > The default non-initialization of allocated storage is a 
>>>>>> > mis-feature that should absolutely be fixed. 
>>>>>> > 
>>>>>> > There is no efficiency argument here in favor of uninitialized 
>>>>>> storage 
>>>>>> > that can outweigh the security and reliability disadvantages... 
>>>>>> > 
>>>>>> > Cheers, 
>>>>>> > Ron Rivest 
>>>>>>
>>>>>> ​
>>>>
>>>>

Reply via email to