|
|
OOPS, I was tricked by the success of my "solution" but the bug
is actually worse.
Wolfgang Wieser wrote:
> [cross-post: povray.bugreports]
>
> Rendering this test code, I can reliably crash POVRay.
>
> -----------------------------------------------------------
> <snipped>
> -----------------------------------------------------------
>
Still. Correct
> The bug may not show up on you box because of it's nature:
>
Correct.
> The reason for the bug is uninitialized static data (yeah...).
>
No. Initializing static data is never a bad idea but the actual
reason for the bug is something else:
In fpmetric.cpp, around line 430, the following code can be found:
-----------------------------------
else
{
/* 1 copy */
if ((SectorNum[i] *= 2) >= Max_intNumber)
SectorNum[i] = Max_intNumber;
SectorNum[i + 1] = SectorNum[i];
SectorNum[i]++;
i++; // <--- BUG!!
Intervals_Low[INDEX_U][i] = low_vect[U];
-------------------------------------
The bug is where I marked it: i is increased but there is no check
if it stays in range 0..31 as required by the array sizes of
Intervals_Low[][] and SectorNum[].
So, the code should be changed into something like:
-----------------------------------
else
{
/* 1 copy */
+ if(i>=31)
+ { Do something (break, continue, ...) }
if ((SectorNum[i] *= 2) >= Max_intNumber)
SectorNum[i] = Max_intNumber;
SectorNum[i + 1] = SectorNum[i];
SectorNum[i]++;
i++;
Intervals_Low[INDEX_U][i] = low_vect[U];
-------------------------------------
I am pretty sure this is the actual reason for the bug because
test output showed the following values for i:
....
i=33
i=32
i=33
i=32
i=32
<crash>
Wolfgang
BTW, I still consider the check for SectorNum<0 in the Z component
calculation as unneeded.
Post a reply to this message
|
|