Subject: | uninitialized loop control variable when computing stats from raw values (do_stats ==1) |
When raw values are input to boxplot.pm (i.e., do_stats is set to 1), the code loops through
the input raw values a few times to find the max,min, and other values necessary to draw the
boxplots. However, the control variable used in each of these loops is never initialized to a
starting value, thus causing perl to return an error when one tries to call boxplot.pm.
Additonally, during the first iteration of these loops, the code tries to compare the
raw_value[0] to $min or $max, which are undefined. If the user inputs pre-computed values
for the boxplot (i.e. sets do_stats to 0), these for loops are never executed and there is no
error.
I have attached a patch that fixes this bug.
Perl version: 5.8.8
GDGraph-Boxplot-1.00
Operating system: Linux 2.6.18
This problem can be reproduced by simply following the example stated in the CPAN
overview page:
$one = [210..275];
$two = [180, 190, 200, 220, 235, 245];
$three = [40, 140..150, 160..180, 250];
$four = [100..125, 136..140];
$five = [10..50, 100, 180];
@data = (
["1st", "2nd", "3rd", "4th", "5th"],
[$one, $two, $three, $four, $five ],
[ [-25, 1..15], [-45, 25..45, 100], [70, 42..125], [undef], [180..250] ],
# as many sets of data sets as you like
);
$my_graph = new GD::Graph::boxplot( );
$gd = $my_graph->plot( \@data );
Subject: | boxplot_patch.patch |
--- /h/rajas/usr/src/GDGraph-boxplot-1.00/boxplot.pm 2001-07-07 12:47:06.000000000 -0400
+++ /h/rajas/usr/lib/perl5/site_perl/5.8.8/GD/Graph/boxplot.pm 2009-04-08 03:25:45.598110000 -0400
@@ -320,7 +320,7 @@ sub draw_data_set
# first check all the values above the box
if ($stat->max() > $maxim)
{
- for(my $j; defined $value->[$j]; $j++)
+ for(my $j = 0; defined $value->[$j]; $j++)
{
if ($value->[$j] > $maxim)
{
@@ -362,7 +362,7 @@ sub draw_data_set
# now repeat the same procedure for values below the box
if ($stat->min() < $minim)
{
- for (my $j; defined $value->[$j]; $j++)
+ for (my $j = 0; defined $value->[$j]; $j++)
{
if ($value->[$j] < $minim)
{
@@ -460,19 +460,19 @@ sub set_max_min
my $max = undef;
my $min = undef;
-
+
if( $self->{do_stats} )
{
for my $i ( 1 .. $self->{_data}->num_sets ) # 1 because x-labels are [0]
{
for my $j ( 0 .. $self->{_data}->num_points )
{
- for (my $k; defined $self->{_data}->[$i][$j][$k]; $k++ )
+ for (my $k = 0; defined $self->{_data}->[$i][$j][$k]; $k++ )
{
$max = $self->{_data}->[$i][$j][$k]
- if ($self->{_data}->[$i][$j][$k] > $max);
+ if (!defined $max || $self->{_data}->[$i][$j][$k] > $max);
$min = $self->{_data}->[$i][$j][$k]
- if ($self->{_data}->[$i][$j][$k] < $min);
+ if (!defined $min || $self->{_data}->[$i][$j][$k] < $min);
}
}
}