Re: [vox-tech] anything wrong with this code?

2010-05-28 Thread Brian Lavender
On Thu, May 27, 2010 at 08:48:06PM -0700, Bill Broadley wrote:
> On 05/27/2010 08:35 PM, Chanoch (Ken) Bloom wrote:
> > On Thu, 2010-05-27 at 22:08 -0400, Hai Yi wrote:
> >> hi there:
> >>
> >> can anyone look at these two small c++ snippets to see what's wrong
> >> with them? I was interviewed with them...
> 
> Out of curiosity, where?  (feel free to not answer)
> 
> >> 1.
> >> A* createA(){ return new A();}
> >>  void fun(){createA();}
> >>  What's wrong with the above code?
> >
> > It leaks memory.

Yeah, you know why the interviewer asked that? Either one of his
employees or _he_ made the error and it started dropping memory on the
floor, not to mention losing access to previously allocated variables. 

It looks like a nice tool for a little bit of nastiness though.
Overwrite a variable, then later creatively drop into that memory
location and get your stash back!

> 
> Is A defined?  Is it that A is allocated but the return value isn't 
> checked (for an allocation failure)?  Or that the pointer isn't used? Or 
> that it leaks?


-- 
Brian Lavender
http://www.brie.com/brian/

"There are two ways of constructing a software design. One way is to
make it so simple that there are obviously no deficiencies. And the other
way is to make it so complicated that there are no obvious deficiencies."

Professor C. A. R. Hoare
The 1980 Turing award lecture
___
vox-tech mailing list
vox-tech@lists.lugod.org
http://lists.lugod.org/mailman/listinfo/vox-tech


Re: [vox-tech] anything wrong with this code?

2010-05-28 Thread Hai Yi
Thanks all. it's Barcap in NYC.
Hai

On Thu, May 27, 2010 at 11:48 PM, Bill Broadley  wrote:
> On 05/27/2010 08:35 PM, Chanoch (Ken) Bloom wrote:
>> On Thu, 2010-05-27 at 22:08 -0400, Hai Yi wrote:
>>> hi there:
>>>
>>> can anyone look at these two small c++ snippets to see what's wrong
>>> with them? I was interviewed with them...
>
> Out of curiosity, where?  (feel free to not answer)
>
>>> 1.
>>> A* createA(){ return new A();}
>>>      void fun(){createA();}
>>>      What's wrong with the above code?
>>
>> It leaks memory.
>
> Is A defined?  Is it that A is allocated but the return value isn't
> checked (for an allocation failure)?  Or that the pointer isn't used? Or
> that it leaks?
>
>>> 2.
>>> for(iter=map.begin();iter!=map.end();iter++){
>>> erase(iter++);
>>> iter++;
>>> }
>>> anything wrong with the above code? What's happened for "iter++" internally?
>>
>>       1. erase() is a member function of the map class. It is not a free
>>          function. A free function named erase() wouldn't know what
>>          container to erase the iterator from.
>>       2. The code only works if map.size() is a multiple of 3. If it
>>          isn't, then one of the iter++ operations may try to put iter 2
>>          or 3 past the end of the map. If you did this on a raw array, or
>>          a vector (whose iterators are usually just pointers to the
>>          elements, unless you're in some kind of debug mode),
>>                * then the standard doesn't guarantee that you can form
>>                  the address of the element 2 or 3 past the end of the
>>                  array,
>>                * if you could form that address it would certainly no
>>                  longer be equal to array.end(), so you'd miss the
>>                  termination condition.
>
> While true, wouldn't it be simpler to just say that iter is incremented
> 3 times per loop and it's likely that the intent is once?  While legal
> in C/C++, in general you shouldn't much with an iteration variable.
> Either turn it into a while (without increment) and handle it in the
> body, or increment in the for loop and don't muck with it in the body.
> ___
> vox-tech mailing list
> vox-tech@lists.lugod.org
> http://lists.lugod.org/mailman/listinfo/vox-tech
>
___
vox-tech mailing list
vox-tech@lists.lugod.org
http://lists.lugod.org/mailman/listinfo/vox-tech


Re: [vox-tech] anything wrong with this code?

2010-05-27 Thread Bill Broadley
On 05/27/2010 08:35 PM, Chanoch (Ken) Bloom wrote:
> On Thu, 2010-05-27 at 22:08 -0400, Hai Yi wrote:
>> hi there:
>>
>> can anyone look at these two small c++ snippets to see what's wrong
>> with them? I was interviewed with them...

Out of curiosity, where?  (feel free to not answer)

>> 1.
>> A* createA(){ return new A();}
>>  void fun(){createA();}
>>  What's wrong with the above code?
>
> It leaks memory.

Is A defined?  Is it that A is allocated but the return value isn't 
checked (for an allocation failure)?  Or that the pointer isn't used? Or 
that it leaks?

>> 2.
>> for(iter=map.begin();iter!=map.end();iter++){
>> erase(iter++);
>> iter++;
>> }
>> anything wrong with the above code? What's happened for "iter++" internally?
>
>   1. erase() is a member function of the map class. It is not a free
>  function. A free function named erase() wouldn't know what
>  container to erase the iterator from.
>   2. The code only works if map.size() is a multiple of 3. If it
>  isn't, then one of the iter++ operations may try to put iter 2
>  or 3 past the end of the map. If you did this on a raw array, or
>  a vector (whose iterators are usually just pointers to the
>  elements, unless you're in some kind of debug mode),
>* then the standard doesn't guarantee that you can form
>  the address of the element 2 or 3 past the end of the
>  array,
>* if you could form that address it would certainly no
>  longer be equal to array.end(), so you'd miss the
>  termination condition.

While true, wouldn't it be simpler to just say that iter is incremented 
3 times per loop and it's likely that the intent is once?  While legal 
in C/C++, in general you shouldn't much with an iteration variable. 
Either turn it into a while (without increment) and handle it in the 
body, or increment in the for loop and don't muck with it in the body.
___
vox-tech mailing list
vox-tech@lists.lugod.org
http://lists.lugod.org/mailman/listinfo/vox-tech


Re: [vox-tech] anything wrong with this code?

2010-05-27 Thread Chanoch (Ken) Bloom
On Thu, 2010-05-27 at 22:08 -0400, Hai Yi wrote:
> hi there:
> 
> can anyone look at these two small c++ snippets to see what's wrong
> with them? I was interviewed with them...
> 
> 1.
> A* createA(){ return new A();}
> void fun(){createA();}
> What's wrong with the above code?

It leaks memory.

> 2.
> for(iter=map.begin();iter!=map.end();iter++){
> erase(iter++);
> iter++;
> }
> anything wrong with the above code? What's happened for "iter++" internally?

 1. erase() is a member function of the map class. It is not a free
function. A free function named erase() wouldn't know what
container to erase the iterator from.
 2. The code only works if map.size() is a multiple of 3. If it
isn't, then one of the iter++ operations may try to put iter 2
or 3 past the end of the map. If you did this on a raw array, or
a vector (whose iterators are usually just pointers to the
elements, unless you're in some kind of debug mode),
  * then the standard doesn't guarantee that you can form
the address of the element 2 or 3 past the end of the
array, 
  * if you could form that address it would certainly no
longer be equal to array.end(), so you'd miss the
termination condition.

--Ken
___
vox-tech mailing list
vox-tech@lists.lugod.org
http://lists.lugod.org/mailman/listinfo/vox-tech