From: Roland Schulz Date: Tue, 26 Mar 2019 00:24:39 +0000 (-0700) Subject: Fix UB vector usage X-Git-Url: http://biod.pnpi.spb.ru/gitweb/?a=commitdiff_plain;h=644376570e25763fcc720c704cf2b30f38ee9595;p=alexxy%2Fgromacs.git Fix UB vector usage It is UB to - increment past end. - decrement end iterator for empty vector. - use operator[] on end iterator. Also fixes a buffer overflow for c_simdBestPairAlignment=2. All found with _LIBCPP_DEBUG=1. Change-Id: Ib21ca875244673b27748a01373e7fc10252a7c44 --- diff --git a/src/gromacs/gmxpreprocess/resall.cpp b/src/gromacs/gmxpreprocess/resall.cpp index fac51b47a2..df04c52f83 100644 --- a/src/gromacs/gmxpreprocess/resall.cpp +++ b/src/gromacs/gmxpreprocess/resall.cpp @@ -376,7 +376,7 @@ void readResidueDatabase(const std::string &rrdb, std::vector print_resall_header(stderr, gmx::arrayRefFromArray(&header_settings, 1)); } /* We don't know the current size of rrtp, but simply realloc immediately */ - auto oldArrayEnd = rtpDBEntry->end() - 1; + auto oldArrayEnd = rtpDBEntry->end(); while (!feof(in)) { /* Initialise rtp entry structure */ diff --git a/src/gromacs/gmxpreprocess/toppush.cpp b/src/gromacs/gmxpreprocess/toppush.cpp index c4d7b16420..8f4c46d437 100644 --- a/src/gromacs/gmxpreprocess/toppush.cpp +++ b/src/gromacs/gmxpreprocess/toppush.cpp @@ -1786,9 +1786,16 @@ defaultInteractionTypeParameters(int ftype, gmx::ArrayRef n ? it+n : end; + }; /* Continue from current iterator position */ - for (auto nextPos = prevPos + 2; (nextPos < bt[ftype].interactionTypes.end()) && bSame; nextPos += 2) + auto nextPos = prevPos; + const auto endIter = bt[ftype].interactionTypes.end(); + safeAdvance(nextPos, 2, endIter); + for (; nextPos < endIter && bSame; safeAdvance(nextPos, 2, endIter)) { bSame = (prevPos->ai() == nextPos->ai() && prevPos->aj() == nextPos->aj() && prevPos->ak() == nextPos->ak() && prevPos->al() == nextPos->al()); if (bSame) diff --git a/src/gromacs/mdlib/lincs.cpp b/src/gromacs/mdlib/lincs.cpp index 185d968f57..169591e0e8 100644 --- a/src/gromacs/mdlib/lincs.cpp +++ b/src/gromacs/mdlib/lincs.cpp @@ -1877,7 +1877,7 @@ static void set_matrix_indices(Lincs *li, if (bSortMatrix) { /* Order the blbnb matrix to optimize memory access */ - std::sort(&(li->blbnb[li->blnr[b]]), &(li->blbnb[li->blnr[b+1]])); + std::sort(li->blbnb.begin()+li->blnr[b], li->blbnb.begin()+li->blnr[b+1]); } } } diff --git a/src/gromacs/nbnxm/atomdata.cpp b/src/gromacs/nbnxm/atomdata.cpp index ac1839e3ec..38c09fcbdf 100644 --- a/src/gromacs/nbnxm/atomdata.cpp +++ b/src/gromacs/nbnxm/atomdata.cpp @@ -273,8 +273,11 @@ static void set_lj_parameter_data(nbnxn_atomdata_t::Params *params, gmx_bool bSI { params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+0] = params->nbfp[(i*nt+j)*2+0]; params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+1] = params->nbfp[(i*nt+j)*2+1]; - params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+2] = 0; - params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+3] = 0; + if (c_simdBestPairAlignment > 2) + { + params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+2] = 0; + params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+3] = 0; + } } } #endif