[ismrmrd] 64/177: improve memory safety in cleanup / free methods
Ghislain Vaillant
ghisvail-guest at moszumanska.debian.org
Wed Jan 14 20:02:03 UTC 2015
This is an automated email from the git hooks/post-receive script.
ghisvail-guest pushed a commit to annotated tag v1.1.0.beta.1
in repository ismrmrd.
commit 4b816fd9ce5dabbb39739ffabf041c07153d641e
Author: Ghislain Antony Vaillant <ghisvail at gmail.com>
Date: Fri Sep 19 17:15:07 2014 +0100
improve memory safety in cleanup / free methods
Also included:
- functions are all organized as init, cleanup, create, free, copy
for consistency
- comments to delimit section for acquisition, image and ndarray
- white space consistency (forgot to turn it off in my editor :S)
---
libsrc/ismrmrd.c | 133 +++++++++++++++++++++++++++----------------------------
1 file changed, 66 insertions(+), 67 deletions(-)
diff --git a/libsrc/ismrmrd.c b/libsrc/ismrmrd.c
index 4b1f758..b4fcf5c 100644
--- a/libsrc/ismrmrd.c
+++ b/libsrc/ismrmrd.c
@@ -28,6 +28,7 @@ namespace ISMRMRD {
extern "C" {
#endif
+/* Acquisition functions */
void ismrmrd_init_acquisition_header(ISMRMRD_AcquisitionHeader *hdr) {
memset(hdr, 0, sizeof(ISMRMRD_AcquisitionHeader));
hdr->version = ISMRMRD_VERSION;
@@ -38,13 +39,13 @@ void ismrmrd_init_acquisition_header(ISMRMRD_AcquisitionHeader *hdr) {
void ismrmrd_init_acquisition(ISMRMRD_Acquisition *acq) {
ismrmrd_init_acquisition_header(&acq->head);
- acq->traj = (float *)malloc(0); /* can be passed to free */
- acq->data = (complex_float_t *)malloc(0);
+ acq->traj = NULL;
+ acq->data = NULL;
}
void ismrmrd_cleanup_acquisition(ISMRMRD_Acquisition *acq) {
- free(acq->data);
- free(acq->traj);
+ free(acq->data); acq->data = NULL;
+ free(acq->traj); acq->traj = NULL;
}
ISMRMRD_Acquisition * ismrmrd_create_acquisition() {
@@ -54,8 +55,7 @@ ISMRMRD_Acquisition * ismrmrd_create_acquisition() {
}
void ismrmrd_free_acquisition(ISMRMRD_Acquisition *acq) {
- free(acq->data);
- free(acq->traj);
+ ismrmrd_cleanup_acquisition(acq);
free(acq);
}
@@ -70,13 +70,13 @@ void ismrmrd_copy_acquisition(ISMRMRD_Acquisition *acqdest, const ISMRMRD_Acquis
}
int ismrmrd_make_consistent_acquisition(ISMRMRD_Acquisition *acq) {
- size_t traj_size, data_size;
-
+ size_t traj_size, data_size;
+
if (acq->head.available_channels < acq->head.active_channels) {
acq->head.available_channels = acq->head.active_channels;
}
-
- traj_size = ismrmrd_size_of_acquisition_traj(acq);
+
+ traj_size = ismrmrd_size_of_acquisition_traj(acq);
if (traj_size > 0) {
acq->traj = (float *)realloc(acq->traj, traj_size);
if (acq->traj == NULL) {
@@ -85,7 +85,7 @@ int ismrmrd_make_consistent_acquisition(ISMRMRD_Acquisition *acq) {
return ISMRMRD_MEMORYERROR;
}
}
-
+
data_size = ismrmrd_size_of_acquisition_data(acq);
if (data_size > 0) {
acq->data = (complex_float_t *)realloc(acq->data, data_size);
@@ -95,7 +95,7 @@ int ismrmrd_make_consistent_acquisition(ISMRMRD_Acquisition *acq) {
return ISMRMRD_MEMORYERROR;
}
}
-
+
return ISMRMRD_NOERROR;
}
@@ -109,7 +109,7 @@ size_t ismrmrd_size_of_acquisition_data(const ISMRMRD_Acquisition *acq) {
return num_data * sizeof(*acq->data);
}
-/* ImageHeader functions */
+/* Image functions */
void ismrmrd_init_image_header(ISMRMRD_ImageHeader *hdr) {
memset(hdr, 0, sizeof(ISMRMRD_ImageHeader));
hdr->version = ISMRMRD_VERSION;
@@ -119,30 +119,28 @@ void ismrmrd_init_image_header(ISMRMRD_ImageHeader *hdr) {
hdr->channels = 1;
}
-/* Image functions */
+void ismrmrd_init_image(ISMRMRD_Image *im) {
+ ismrmrd_init_image_header(&im->head);
+ im->attribute_string = NULL;
+ im->data = NULL;
+}
+
ISMRMRD_Image * ismrmrd_create_image() {
ISMRMRD_Image *im = (ISMRMRD_Image *) malloc(sizeof(ISMRMRD_Image));
ismrmrd_init_image(im);
return im;
}
+void ismrmrd_cleanup_image(ISMRMRD_Image *im) {
+ free(im->attribute_string); im->attribute_string = NULL;
+ free(im->data); im->data = NULL;
+}
+
void ismrmrd_free_image(ISMRMRD_Image *im) {
- free(im->data);
- free(im->attribute_string);
+ ismrmrd_cleanup_image(im);
free(im);
}
-
-void ismrmrd_init_image(ISMRMRD_Image *im) {
- ismrmrd_init_image_header(&im->head);
- im->attribute_string = (char *) malloc(0); /* can be passed to free */
- im->data = (void *) malloc(0);
-}
-void ismrmrd_cleanup_image(ISMRMRD_Image *im) {
- free(im->attribute_string);
- free(im->data);
-}
-
void ismrmrd_copy_image(ISMRMRD_Image *imdest, const ISMRMRD_Image *imsource) {
memcpy(&imdest->head, &imsource->head, sizeof(ISMRMRD_ImageHeader));
ismrmrd_make_consistent_image(imdest);
@@ -153,8 +151,8 @@ void ismrmrd_copy_image(ISMRMRD_Image *imdest, const ISMRMRD_Image *imsource) {
int ismrmrd_make_consistent_image(ISMRMRD_Image *im) {
size_t attr_size, data_size;
-
- attr_size = ismrmrd_size_of_image_attribute_string(im);
+
+ attr_size = ismrmrd_size_of_image_attribute_string(im);
if (attr_size > 0) {
im->attribute_string = (char *)realloc(im->attribute_string, attr_size);
if (im->attribute_string == NULL) {
@@ -163,7 +161,7 @@ int ismrmrd_make_consistent_image(ISMRMRD_Image *im) {
return ISMRMRD_MEMORYERROR;
}
}
-
+
data_size = ismrmrd_size_of_image_data(im);
if (data_size > 0) {
im->data = realloc(im->data, data_size);
@@ -173,7 +171,7 @@ int ismrmrd_make_consistent_image(ISMRMRD_Image *im) {
return ISMRMRD_MEMORYERROR;
}
}
-
+
return ISMRMRD_NOERROR;
}
@@ -181,7 +179,7 @@ size_t ismrmrd_size_of_image_data(const ISMRMRD_Image *im) {
size_t data_size = 0;
int num_data = im->head.matrix_size[0] * im->head.matrix_size[1] *
im->head.matrix_size[2] * im->head.channels;
-
+
switch (im->head.data_type) {
case ISMRMRD_USHORT:
data_size = num_data * sizeof(uint16_t);
@@ -219,42 +217,42 @@ size_t ismrmrd_size_of_image_attribute_string(const ISMRMRD_Image *im) {
}
/* NDArray functions */
-ISMRMRD_NDArray * ismrmrd_create_ndarray() {
- ISMRMRD_NDArray *arr = (ISMRMRD_NDArray *) malloc(sizeof(ISMRMRD_NDArray));
- ismrmrd_init_ndarray(arr);
- return arr;
-}
-
-void ismrmrd_free_ndarray(ISMRMRD_NDArray *arr) {
- free(arr->data);
- free(arr);
-}
-
void ismrmrd_init_ndarray(ISMRMRD_NDArray *arr) {
- int n;
-
- arr->version = ISMRMRD_VERSION;
+ int n;
+
+ arr->version = ISMRMRD_VERSION;
arr->data_type = 0; // no default data type
arr->ndim = 0;
-
+
for (n = 0; n < ISMRMRD_NDARRAY_MAXDIM; n++) {
arr->dims[n] = 0;
}
- arr->data = malloc(0); /* Can be freed */
+ arr->data = NULL;
+}
+
+ISMRMRD_NDArray * ismrmrd_create_ndarray() {
+ ISMRMRD_NDArray *arr = (ISMRMRD_NDArray *) malloc(sizeof(ISMRMRD_NDArray));
+ ismrmrd_init_ndarray(arr);
+ return arr;
}
void ismrmrd_cleanup_ndarray(ISMRMRD_NDArray *arr) {
- free(arr->data);
+ free(arr->data); arr->data = NULL;
+}
+
+void ismrmrd_free_ndarray(ISMRMRD_NDArray *arr) {
+ ismrmrd_cleanup_ndarray(arr);
+ free(arr);
}
void ismrmrd_copy_ndarray(ISMRMRD_NDArray *arrdest, const ISMRMRD_NDArray *arrsource) {
int n;
-
+
arrdest->version = arrsource->version;
arrdest->data_type = arrsource->data_type;
arrdest->ndim = arrsource->ndim;
-
- for (n = 0; n < ISMRMRD_NDARRAY_MAXDIM; n++) {
+
+ for (n = 0; n < ISMRMRD_NDARRAY_MAXDIM; n++) {
arrdest->dims[n] = arrsource->dims[n];
}
ismrmrd_make_consistent_ndarray(arrdest);
@@ -282,11 +280,11 @@ int ismrmrd_make_consistent_ndarray(ISMRMRD_NDArray *arr) {
size_t ismrmrd_size_of_ndarray_data(const ISMRMRD_NDArray *arr) {
size_t data_size = 0;
int num_data = 1;
- int n;
+ int n;
for (n = 0; n < arr->ndim; n++) {
num_data *= arr->dims[n];
}
-
+
switch (arr->data_type) {
case ISMRMRD_USHORT:
data_size = num_data * sizeof(uint16_t);
@@ -316,10 +314,11 @@ size_t ismrmrd_size_of_ndarray_data(const ISMRMRD_NDArray *arr) {
ISMRMRD_THROW(ISMRMRD_TYPEERROR, "Invalid NDArray data type");
data_size = 0;
}
-
+
return data_size;
}
+/* Misc. functions */
bool ismrmrd_is_flag_set(const uint64_t flags, const uint64_t val) {
uint64_t bitmask = 1 << (val - 1);
return (flags & bitmask) > 0;
@@ -363,7 +362,7 @@ char *ismrmrd_strerror(int err) {
assert(err > ISMRMRD_BEGINERROR);
assert(err < ISMRMRD_ENDERROR);
-
+
return error_messages[err];
}
@@ -371,11 +370,11 @@ int ismrmrd_sign_of_directions(float read_dir[3], float phase_dir[3], float slic
float r11 = read_dir[0], r12 = phase_dir[0], r13 = slice_dir[0];
float r21 = read_dir[1], r22 = phase_dir[1], r23 = slice_dir[1];
float r31 = read_dir[2], r32 = phase_dir[2], r33 = slice_dir[2];
-
+
/* Determinant should be 1 or -1 */
float deti = (r11 * r22 * r33) + (r12 * r23 * r31) + (r21 * r32 * r13) -
(r13 * r22 * r31) - (r12 * r21 * r33) - (r11 * r23 * r32);
-
+
if (deti < 0) {
return -1;
} else {
@@ -388,11 +387,11 @@ void ismrmrd_directions_to_quaternion(float read_dir[3], float phase_dir[3],
float r11 = read_dir[0], r12 = phase_dir[0], r13 = slice_dir[0];
float r21 = read_dir[1], r22 = phase_dir[1], r23 = slice_dir[1];
float r31 = read_dir[2], r32 = phase_dir[2], r33 = slice_dir[2];
-
+
double a = 1, b = 0, c = 0, d = 0, s = 0;
double trace = 0;
double xd, yd, zd;
-
+
/* verify the sign of the rotation*/
if (ismrmrd_sign_of_directions(read_dir, phase_dir, slice_dir) < 0) {
/* flip 3rd column */
@@ -400,7 +399,7 @@ void ismrmrd_directions_to_quaternion(float read_dir[3], float phase_dir[3],
r23 = -r23;
r33 = -r33;
}
-
+
/* Compute quaternion parameters */
/* http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q55 */
trace = 1.0l + r11 + r22 + r33;
@@ -412,8 +411,8 @@ void ismrmrd_directions_to_quaternion(float read_dir[3], float phase_dir[3],
d = 0.25l * s;
} else {
/* trickier case...
- * determine which major diagonal element has
- * the greatest value... */
+ * determine which major diagonal element has
+ * the greatest value... */
xd = 1.0 + r11 - (r22 + r33); /* 4**b**b */
yd = 1.0 + r22 - (r11 + r33); /* 4**c**c */
zd = 1.0 + r33 - (r11 + r22); /* 4**d**d */
@@ -449,7 +448,7 @@ void ismrmrd_directions_to_quaternion(float read_dir[3], float phase_dir[3],
a = -a;
}
}
-
+
quat[0] = (float)a;
quat[1] = (float)b;
quat[2] = (float)c;
@@ -460,15 +459,15 @@ void ismrmrd_directions_to_quaternion(float read_dir[3], float phase_dir[3],
void ismrmrd_quaternion_to_directions(float quat[4], float read_dir[3],
float phase_dir[3], float slice_dir[3]) {
float a = quat[0], b = quat[1], c = quat[2], d = quat[3];
-
+
read_dir[0] = 1.0f - 2.0f * (b * b + c * c);
phase_dir[0] = 2.0f * (a * b - c * d);
slice_dir[0] = 2.0f * (a * c + b * d);
-
+
read_dir[1] = 2.0f * (a * b + c * d);
phase_dir[1] = 1.0f - 2.0f * (a * a + c * c);
slice_dir[1] = 2.0f * (b * c - a * d);
-
+
read_dir[2] = 2.0f * (a * c - b * d);
phase_dir[2] = 2.0f * (b * c + a * d);
slice_dir[2] = 1.0f - 2.0f * (a * a + b * b);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ismrmrd.git
More information about the debian-science-commits
mailing list