From 588edbc5dd619420ad412b62daeba34bd3140bde Mon Sep 17 00:00:00 2001 From: Simon White Date: Thu, 23 May 2024 13:16:39 +0200 Subject: [PATCH] BugFix: memory error incollective effects circular buffers (#771) * circular buffer with size one correctly handled * avoid divide by 0 if no parts in bunch --------- Co-authored-by: Lee Carver --- atintegrators/BeamLoadingCavityPass.c | 4 +++- atintegrators/atimplib.c | 17 ++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/atintegrators/BeamLoadingCavityPass.c b/atintegrators/BeamLoadingCavityPass.c index 38203293f..6549d4dc3 100644 --- a/atintegrators/BeamLoadingCavityPass.c +++ b/atintegrators/BeamLoadingCavityPass.c @@ -42,7 +42,9 @@ struct elem void write_buffer(double *data, double *buffer, int datasize, int buffersize){ - memmove(buffer, buffer + datasize, datasize*buffersize*sizeof(double)); + if(buffersize>1){ + memmove(buffer, buffer + datasize, datasize*buffersize*sizeof(double)); + } memcpy(buffer + datasize*(buffersize-1), data, datasize*sizeof(double)); } diff --git a/atintegrators/atimplib.c b/atintegrators/atimplib.c index 14c157e56..224f2c0ec 100644 --- a/atintegrators/atimplib.c +++ b/atintegrators/atimplib.c @@ -38,11 +38,13 @@ static double getTableWake(double *waketable,double *waketableT,double distance, }; static void rotate_table_history(long nturns,long nslice,double *turnhistory,double circumference){ - memmove(turnhistory, turnhistory + nslice, 4*nslice*nturns*sizeof(double)); - double *z = turnhistory+nslice*nturns*2; int i; - for(i=0; i 1){ + memmove(turnhistory, turnhistory + nslice, 4*nslice*nturns*sizeof(double)); + double *z = turnhistory+nslice*nturns*2; + for(i=0; i0.0) ? xpos[i]/weight[i] : 0.0; ypos[i] = (weight[i]>0.0) ? ypos[i]/weight[i] : 0.0; - weight[i] *= bunch_currents[ib]/np_bunch[ib]; + if (np_bunch[ib] == 0.0) { + weight[i] = 0.0; + } + else { + weight[i] *= bunch_currents[ib]/np_bunch[ib]; + } } atFree(np_bunch); atFree(smin);