plotting/grid.c, bug fix, avoid string buffer overflow
Prevent a crash of example/FFT_test.cir.
Buffer 'buf' in function drawlingrid() has been too small.
Increase 'buf' size, and add some protection.
The example file examples/plot/test-small-plot.cir
shows the limits of plotting:
difference in two numbers at digit 14 is plotted well.
at digit 15 is plotted with bugs.
at digit 16 is reduced to integer.
consider compiling with
-O1 -D_FORTIFY_SOURCE=2
for gcc, and
/GS
for visual studio.
This commit is contained in:
parent
c892b2d460
commit
560cb6e970
|
|
@ -0,0 +1,116 @@
|
|||
resolution test for plotting
|
||||
.control
|
||||
let xvar = vector(4)
|
||||
let yvar = vector(4)
|
||||
|
||||
* --------------------
|
||||
* integer
|
||||
let yvar[0] = 1.0
|
||||
let yvar[1] = 1.0
|
||||
let yvar[2] = 1.0
|
||||
let yvar[3] = 1.0
|
||||
|
||||
plot yvar vs xvar title integer 1
|
||||
|
||||
* --------------------
|
||||
* 14 digits
|
||||
let yvar[0] = 1.0
|
||||
let yvar[1] = 1.00000000000001
|
||||
let yvar[2] = 0.99999999999999
|
||||
let yvar[3] = 1.0
|
||||
|
||||
plot yvar vs xvar title '14 digits'
|
||||
|
||||
* --------------------
|
||||
* 15 digits
|
||||
let yvar[0] = 1.0
|
||||
let yvar[1] = 1.000000000000001
|
||||
let yvar[2] = 0.999999999999999
|
||||
let yvar[3] = 1.0
|
||||
|
||||
plot yvar vs xvar title '15 digits'
|
||||
|
||||
* --------------------
|
||||
* 16 digits
|
||||
let yvar[0] = 1.0
|
||||
let yvar[1] = 1.0000000000000001
|
||||
let yvar[2] = 0.9999999999999999
|
||||
let yvar[3] = 1.0
|
||||
|
||||
plot yvar vs xvar title '16 digits'
|
||||
|
||||
* --------------------
|
||||
* 14 digits plus exponent
|
||||
let yvar[0] = 1.0e-14
|
||||
let yvar[1] = 1.00000000000001e-14
|
||||
let yvar[2] = 0.99999999999999e-14
|
||||
let yvar[3] = 1.0e-14
|
||||
|
||||
plot yvar vs xvar title '14 digits plus exponent'
|
||||
|
||||
* --------------------
|
||||
* 15 digits plus exponent
|
||||
let yvar[0] = 1.0e-14
|
||||
let yvar[1] = 1.000000000000001e-14
|
||||
let yvar[2] = 0.999999999999999e-14
|
||||
let yvar[3] = 1.0e-14
|
||||
|
||||
plot yvar vs xvar title '15 digits plus exponent'
|
||||
|
||||
* --------------------
|
||||
* 16 digits plus exponent
|
||||
let yvar[0] = 1.0e-14
|
||||
let yvar[1] = 1.0000000000000001e-14
|
||||
let yvar[2] = 0.9999999999999999e-14
|
||||
let yvar[3] = 1.0e-14
|
||||
|
||||
plot yvar vs xvar title '16 digits plus exponent'
|
||||
|
||||
* --------------------
|
||||
* negative 14 digits plus exponent
|
||||
let yvar[0] = -1.0e-14
|
||||
let yvar[1] = -1.00000000000001e-14
|
||||
let yvar[2] = -0.99999999999999e-14
|
||||
let yvar[3] = -1.0e-14
|
||||
|
||||
plot yvar vs xvar title 'neg 14 digits plus exponent'
|
||||
|
||||
* --------------------
|
||||
* negative 15 digits plus exponent
|
||||
let yvar[0] = -1.0e-14
|
||||
let yvar[1] = -1.000000000000001e-14
|
||||
let yvar[2] = -0.999999999999999e-14
|
||||
let yvar[3] = -1.0e-14
|
||||
|
||||
plot yvar vs xvar title 'neg 15 digits plus exponent'
|
||||
|
||||
* --------------------
|
||||
* negative 16 digits plus exponent
|
||||
let yvar[0] = -1.0e-14
|
||||
let yvar[1] = -1.0000000000000001e-14
|
||||
let yvar[2] = -0.9999999999999999e-14
|
||||
let yvar[3] = -1.0e-14
|
||||
|
||||
plot yvar vs xvar title 'neg 16 digits plus exponent'
|
||||
|
||||
* --------------------
|
||||
* 15 digits plus big exponent
|
||||
let yvar[0] = 1.0e-200
|
||||
let yvar[1] = 1.000000000000001e-200
|
||||
let yvar[2] = 0.999999999999999e-200
|
||||
let yvar[3] = 1.0e-200
|
||||
|
||||
plot yvar vs xvar title '15 digits plus big exponent'
|
||||
|
||||
* --------------------
|
||||
* negative 15 digits plus big exponent
|
||||
let yvar[0] = -1.0e-200
|
||||
let yvar[1] = -1.000000000000001e-200
|
||||
let yvar[2] = -0.999999999999999e-200
|
||||
let yvar[3] = -1.0e-200
|
||||
|
||||
plot yvar vs xvar title 'neg 15 digits plus big exponent'
|
||||
|
||||
.endc
|
||||
|
||||
.end
|
||||
|
|
@ -365,10 +365,10 @@ lingrid(GRAPH *graph, double lo, double hi, double delta, int type, Axis axis)
|
|||
buf[0] = '\0';
|
||||
}
|
||||
|
||||
if ((s = ft_typabbrev(type)) != NULL)
|
||||
(void) strncat(buf, s, sizeof(buf) - strlen(buf) - 1);
|
||||
else
|
||||
(void) strncat(buf, "Units", sizeof(buf) - strlen(buf) - 1);
|
||||
s = ft_typabbrev(type);
|
||||
if (!s)
|
||||
s = "Units";
|
||||
strncat(buf, s, sizeof(buf) - strlen(buf) - 1);
|
||||
|
||||
if (delta == 0.0) {
|
||||
int i;
|
||||
|
|
@ -527,7 +527,7 @@ drawlingrid(GRAPH *graph, char *units, int spacing, int nsp, double dst, double
|
|||
if (j == 0)
|
||||
SetLinestyle(1);
|
||||
|
||||
(void) sprintf(buf, "%.*f", digits + 1, m * mag / 100.0);
|
||||
snprintf(buf, sizeof(buf), "%.*f", digits + 1, m * mag / 100.0);
|
||||
|
||||
if (axis == x_axis)
|
||||
DevDrawText(buf, graph->viewportxoff + i -
|
||||
|
|
@ -629,10 +629,12 @@ loggrid(GRAPH *graph, double lo, double hi, int type, Axis axis)
|
|||
dd[0] = pow(10.0, (double) lmt);
|
||||
dd[1] = pow(10.0, (double) hmt);
|
||||
|
||||
if ((s = ft_typabbrev(type)) != NULL)
|
||||
(void) strcpy(buf, s);
|
||||
else
|
||||
(void) strcpy(buf, "Units");
|
||||
buf[0] = '\0';
|
||||
|
||||
s = ft_typabbrev(type);
|
||||
if (!s)
|
||||
s = "Units";
|
||||
strncat(buf, s, sizeof(buf) - strlen(buf) - 1);
|
||||
|
||||
if (axis == x_axis) {
|
||||
(void) strcpy(graph->grid.xaxis.log.units, buf);
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ Author: 1988 Jeffrey M. Hsu
|
|||
|
||||
struct _keyed;
|
||||
|
||||
#define GRAPH_UNITS_LENGTH 16
|
||||
#define GRAPH_UNITS_LENGTH 20
|
||||
|
||||
/* Device-independent data structure for plots. */
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue