aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjthorn <jthorn@df1f8a13-aa1d-4dd4-9681-27ded5b42416>2002-12-20 15:10:22 +0000
committerjthorn <jthorn@df1f8a13-aa1d-4dd4-9681-27ded5b42416>2002-12-20 15:10:22 +0000
commitbd533e3e3243827a5667ab2efbeefdb85ffda30f (patch)
treea5f69063e47f3402ee8c17e051d76d6c8c79ae1e /src
parentcb9aaede7365d60bc7e0543ce36873de7893607a (diff)
add testing for the error case where the grid is smaller than the molecule
(before this would access memory off the end of the grid ==> core dump on some platforms, eg alphas) git-svn-id: http://svn.cactuscode.org/arrangements/CactusBase/LocalInterp/trunk@122 df1f8a13-aa1d-4dd4-9681-27ded5b42416
Diffstat (limited to 'src')
-rw-r--r--src/GeneralizedPolynomial-Uniform/InterpLocalUniform.h27
-rw-r--r--src/GeneralizedPolynomial-Uniform/molecule_posn.c24
-rw-r--r--src/GeneralizedPolynomial-Uniform/template.c21
3 files changed, 53 insertions, 19 deletions
diff --git a/src/GeneralizedPolynomial-Uniform/InterpLocalUniform.h b/src/GeneralizedPolynomial-Uniform/InterpLocalUniform.h
index 24be556..d2990df 100644
--- a/src/GeneralizedPolynomial-Uniform/InterpLocalUniform.h
+++ b/src/GeneralizedPolynomial-Uniform/InterpLocalUniform.h
@@ -20,16 +20,16 @@ typedef int bool;
/******************************************************************************/
/* number of integers in the range [x,y] inclusive */
-#define how_many_in_range(x,y) ((y) - (x) + 1)
+#define HOW_MANY_IN_RANGE(x,y) ((y) - (x) + 1)
/* is the integer x even/odd? */
-#define is_even(x) (((x) & 0x1) == 0)
-#define is_odd (x) (((x) & 0x1) != 0)
+#define IS_EVEN(x) (((x) & 0x1) == 0)
+#define IS_ODD (x) (((x) & 0x1) != 0)
/* round floating-point value to nearest integer */
/* ... result is expressed as floating point! */
/* ... needs <math.h> for floor() */
-#define jt_round(x) floor((x) + 0.5)
+#define JT_ROUND(x) floor((x) + 0.5)
/******************************************************************************/
@@ -149,6 +149,25 @@ struct Jacobian_info
CCTK_INT Jacobian_part_stride;
};
+/**************************************/
+
+/*
+ * error codes for LocalInterp_molecule_posn()
+ * ... these are defined in terms of INT_MIN from <limits.h>
+ */
+
+/* x < minimum allowable x in grid */
+#define MOLECULE_POSN_ERROR_X_LT_MIN (INT_MIN + 0)
+
+/* x > maximum allowable x in grid */
+#define MOLECULE_POSN_ERROR_X_GT_MAX (INT_MIN + 1)
+
+/* grid is smaller than molecule */
+#define MOLECULE_POSN_ERROR_GRID_TINY (INT_MIN + 2)
+
+/* is a given integer an error code? */
+#define IS_MOLECULE_POSN_ERROR_CODE(x) (x <= MOLECULE_POSN_ERROR_GRID_TINY)
+
/******************************************************************************/
/*
diff --git a/src/GeneralizedPolynomial-Uniform/molecule_posn.c b/src/GeneralizedPolynomial-Uniform/molecule_posn.c
index 44e78fc..e007396 100644
--- a/src/GeneralizedPolynomial-Uniform/molecule_posn.c
+++ b/src/GeneralizedPolynomial-Uniform/molecule_posn.c
@@ -140,12 +140,16 @@ static const char *rcsid = "$Header$";
@returntype int
@returndesc
This function returns the integer coordinate i_center at which
- the molecule should be centered, or one of the error codes
- (from <limits.h>)
- INT_MIN if x is out-of-range on the min end of the grid
- (i.e. x < the minimum allowable x)
- INT_MAX if x is out-of-range on the max end of the grid
- (i.e. x > the maximum allowable x)
+ the molecule should be centered, or one of the error codes defined
+ in "InterpLocalUniform.h":
+ MOLECULE_POSN_ERROR_X_LT_MIN
+ if x is out-of-range on the min end of the grid
+ (i.e. x < the minimum allowable x)
+ MOLECULE_POSN_ERROR_X_GT_MAX
+ if x is out-of-range on the max end of the grid
+ (i.e. x > the maximum allowable x)
+ MOLECULE_POSN_ERROR_GRID_TINY
+ if the grid is smaller than the molecule
@endreturndesc
@@*/
int LocalInterp_molecule_posn(fp grid_origin, fp grid_delta,
@@ -184,7 +188,7 @@ if (out_of_range_tolerance_max >= 0.0)
/* (see diagram in header comment for explanation) */
/* ... as a floating-point number */
{
-const fp fp_i_center = is_even(molecule_size) ? floor(fp_i) : jt_round(fp_i);
+const fp fp_i_center = IS_EVEN(molecule_size) ? floor(fp_i) : JT_ROUND(fp_i);
/* ... as an integer */
int i_center = (int) fp_i_center;
@@ -194,13 +198,15 @@ const int centered_i_max = i_center + m_max;
/* check if off-centered molecules are forbidden? */
if ((out_of_range_tolerance_min == -1.0) && (centered_i_min < grid_i_min))
- then return INT_MIN; /*** ERROR RETURN ***/
+ then return MOLECULE_POSN_ERROR_X_LT_MIN; /*** ERROR RETURN ***/
if ((out_of_range_tolerance_max == -1.0) && (centered_i_max > grid_i_max))
- then return INT_MAX; /*** ERROR RETURN ***/
+ then return MOLECULE_POSN_ERROR_X_GT_MAX; /*** ERROR RETURN ***/
/* off-center as needed if we're close to the edge of the grid */
{
int shift = 0;
+if (molecule_size > HOW_MANY_IN_RANGE(grid_i_min,grid_i_max))
+ then return MOLECULE_POSN_ERROR_GRID_TINY; /*** ERROR RETURN ***/
if (centered_i_min < grid_i_min)
then shift = grid_i_min - centered_i_min; /* a positive number */
if (centered_i_max > grid_i_max)
diff --git a/src/GeneralizedPolynomial-Uniform/template.c b/src/GeneralizedPolynomial-Uniform/template.c
index ac1d98e..0bb409b 100644
--- a/src/GeneralizedPolynomial-Uniform/template.c
+++ b/src/GeneralizedPolynomial-Uniform/template.c
@@ -945,37 +945,46 @@ int pt;
/* is the interpolation point out-of-range? */
#if (N_DIMS >= 1)
- if ((center_i == INT_MIN) || (center_i == INT_MAX))
+ if (IS_MOLECULE_POSN_ERROR_CODE(center_i))
then {
+ if (center_i == MOLECULE_POSN_ERROR_GRID_TINY)
+ then return CCTK_ERROR_INTERP_GRID_TOO_TINY;
if (error_flags != NULL)
then {
error_flags->error_pt = pt;
error_flags->error_axis = X_AXIS;
- error_flags->error_end = (center_i > 0) ? +1 : -1;
+ error_flags->error_end
+ = (center_i == MOLECULE_POSN_ERROR_X_GT_MAX) ? +1 : -1;
}
return CCTK_ERROR_INTERP_POINT_X_RANGE; /*** ERROR RETURN ***/
}
#endif
#if (N_DIMS >= 2)
- if ((center_j == INT_MIN) || (center_j == INT_MAX))
+ if (IS_MOLECULE_POSN_ERROR_CODE(center_j))
then {
+ if (center_j == MOLECULE_POSN_ERROR_GRID_TINY)
+ then return CCTK_ERROR_INTERP_GRID_TOO_TINY;
if (error_flags != NULL)
then {
error_flags->error_pt = pt;
error_flags->error_axis = Y_AXIS;
- error_flags->error_end = (center_j > 0) ? +1 : -1;
+ error_flags->error_end
+ = (center_j == MOLECULE_POSN_ERROR_X_GT_MAX) ? +1 : -1;
}
return CCTK_ERROR_INTERP_POINT_X_RANGE; /*** ERROR RETURN ***/
}
#endif
#if (N_DIMS >= 3)
- if ((center_k == INT_MIN) || (center_k == INT_MAX))
+ if (IS_MOLECULE_POSN_ERROR_CODE(center_k))
then {
+ if (center_k == MOLECULE_POSN_ERROR_GRID_TINY)
+ then return CCTK_ERROR_INTERP_GRID_TOO_TINY;
if (error_flags != NULL)
then {
error_flags->error_pt = pt;
error_flags->error_axis = Z_AXIS;
- error_flags->error_end = (center_k > 0) ? +1 : -1;
+ error_flags->error_end
+ = (center_k == MOLECULE_POSN_ERROR_X_GT_MAX) ? +1 : -1;
}
return CCTK_ERROR_INTERP_POINT_X_RANGE; /*** ERROR RETURN ***/
}