summaryrefslogtreecommitdiff
path: root/editeng
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2022-05-12 14:42:37 +0200
committerStephan Bergmann <sbergman@redhat.com>2022-05-13 09:24:15 +0200
commiteac2e7520de09d019c07b63f9f89d865c20b1e4e (patch)
treeea8512a14164a77165b4937305ea5f137fdd56e1 /editeng
parentc7d80d229a5660a0ee702477bfbd2ca137992a7d (diff)
Pick a better type for the GetAttrib nAttr parameter
...which indexes into a std::vector. To avoid the blemish of accompanying std::size_t variables potentially getting decremented past zero (even though that would be technically OK and not UB), rework some accompanying code to avoid that. Change-Id: Ie1ab2d079a7d8d34fceda1da2d31fa6a8c4fad6c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134255 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'editeng')
-rw-r--r--editeng/inc/editdoc.hxx5
-rw-r--r--editeng/source/editeng/editdoc.cxx49
-rw-r--r--editeng/source/editeng/impedit3.cxx3
-rw-r--r--editeng/source/editeng/impedit4.cxx5
4 files changed, 36 insertions, 26 deletions
diff --git a/editeng/inc/editdoc.hxx b/editeng/inc/editdoc.hxx
index b37fefd40bd0..5242a61a73f0 100644
--- a/editeng/inc/editdoc.hxx
+++ b/editeng/inc/editdoc.hxx
@@ -30,6 +30,7 @@
#include <tools/lineend.hxx>
#include <o3tl/typed_flags_set.hxx>
+#include <cstddef>
#include <memory>
#include <string_view>
#include <vector>
@@ -809,9 +810,9 @@ public:
static OUString GetSepStr( LineEnd eEnd );
};
-inline EditCharAttrib* GetAttrib(CharAttribList::AttribsType& rAttribs, sal_Int32 nAttr)
+inline EditCharAttrib* GetAttrib(CharAttribList::AttribsType& rAttribs, std::size_t nAttr)
{
- return (nAttr < static_cast<sal_Int32>(rAttribs.size())) ? rAttribs[nAttr].get() : nullptr;
+ return (nAttr < rAttribs.size()) ? rAttribs[nAttr].get() : nullptr;
}
#if OSL_DEBUG_LEVEL > 0 && !defined NDEBUG
diff --git a/editeng/source/editeng/editdoc.cxx b/editeng/source/editeng/editdoc.cxx
index 3aa587b04ad1..fba3408f1cc6 100644
--- a/editeng/source/editeng/editdoc.cxx
+++ b/editeng/source/editeng/editdoc.cxx
@@ -59,6 +59,7 @@
#include <algorithm>
#include <cassert>
+#include <cstddef>
#include <limits>
#include <memory>
#include <set>
@@ -1215,7 +1216,7 @@ void ContentNode::ExpandAttribs( sal_Int32 nIndex, sal_Int32 nNew, SfxItemPool&
bool bResort = false;
bool bExpandedEmptyAtIndexNull = false;
- sal_Int32 nAttr = 0;
+ std::size_t nAttr = 0;
CharAttribList::AttribsType& rAttribs = aCharAttribList.GetAttribs();
EditCharAttrib* pAttrib = GetAttrib(rAttribs, nAttr);
while ( pAttrib )
@@ -1280,7 +1281,7 @@ void ContentNode::ExpandAttribs( sal_Int32 nIndex, sal_Int32 nNew, SfxItemPool&
{
// Check if this kind of attribute was empty and expanded here...
sal_uInt16 nW = pAttrib->GetItem()->Which();
- for ( sal_Int32 nA = 0; nA < nAttr; nA++ )
+ for ( std::size_t nA = 0; nA < nAttr; nA++ )
{
const EditCharAttrib& r = *aCharAttribList.GetAttribs()[nA];
if ( ( r.GetStart() == 0 ) && ( r.GetItem()->Which() == nW ) )
@@ -1318,9 +1319,11 @@ void ContentNode::ExpandAttribs( sal_Int32 nIndex, sal_Int32 nNew, SfxItemPool&
bResort = true;
rItemPool.Remove( *pAttrib->GetItem() );
rAttribs.erase(rAttribs.begin()+nAttr);
- --nAttr;
}
- ++nAttr;
+ else
+ {
+ ++nAttr;
+ }
pAttrib = GetAttrib(rAttribs, nAttr);
}
@@ -1352,7 +1355,7 @@ void ContentNode::CollapseAttribs( sal_Int32 nIndex, sal_Int32 nDeleted, SfxItem
bool bResort = false;
sal_Int32 nEndChanges = nIndex+nDeleted;
- sal_Int32 nAttr = 0;
+ std::size_t nAttr = 0;
CharAttribList::AttribsType& rAttribs = aCharAttribList.GetAttribs();
EditCharAttrib* pAttrib = GetAttrib(rAttribs, nAttr);
while ( pAttrib )
@@ -1412,12 +1415,14 @@ void ContentNode::CollapseAttribs( sal_Int32 nIndex, sal_Int32 nDeleted, SfxItem
bResort = true;
rItemPool.Remove( *pAttrib->GetItem() );
rAttribs.erase(rAttribs.begin()+nAttr);
- nAttr--;
}
- else if ( pAttrib->IsEmpty() )
- aCharAttribList.SetHasEmptyAttribs(true);
+ else
+ {
+ if ( pAttrib->IsEmpty() )
+ aCharAttribList.SetHasEmptyAttribs(true);
+ nAttr++;
+ }
- nAttr++;
pAttrib = GetAttrib(rAttribs, nAttr);
}
@@ -1443,7 +1448,7 @@ void ContentNode::CopyAndCutAttribs( ContentNode* pPrevNode, SfxItemPool& rPool,
sal_Int32 nCut = pPrevNode->Len();
- sal_Int32 nAttr = 0;
+ std::size_t nAttr = 0;
CharAttribList::AttribsType& rPrevAttribs = pPrevNode->GetCharAttribs().GetAttribs();
EditCharAttrib* pAttrib = GetAttrib(rPrevAttribs, nAttr);
while ( pAttrib )
@@ -1451,7 +1456,7 @@ void ContentNode::CopyAndCutAttribs( ContentNode* pPrevNode, SfxItemPool& rPool,
if ( pAttrib->GetEnd() < nCut )
{
// remain unchanged...
- ;
+ nAttr++;
}
else if ( pAttrib->GetEnd() == nCut )
{
@@ -1462,6 +1467,7 @@ void ContentNode::CopyAndCutAttribs( ContentNode* pPrevNode, SfxItemPool& rPool,
assert(pNewAttrib);
aCharAttribList.InsertAttrib( pNewAttrib );
}
+ nAttr++;
}
else if ( pAttrib->IsInside( nCut ) || ( !nCut && !pAttrib->GetStart() && !pAttrib->IsFeature() ) )
{
@@ -1471,6 +1477,7 @@ void ContentNode::CopyAndCutAttribs( ContentNode* pPrevNode, SfxItemPool& rPool,
assert(pNewAttrib);
aCharAttribList.InsertAttrib( pNewAttrib );
pAttrib->GetEnd() = nCut;
+ nAttr++;
}
else
{
@@ -1479,9 +1486,7 @@ void ContentNode::CopyAndCutAttribs( ContentNode* pPrevNode, SfxItemPool& rPool,
aCharAttribList.InsertAttrib(it->release());
rPrevAttribs.erase(it);
pAttrib->MoveBackward( nCut );
- nAttr--;
}
- nAttr++;
pAttrib = GetAttrib(rPrevAttribs, nAttr);
}
@@ -1502,7 +1507,7 @@ void ContentNode::AppendAttribs( ContentNode* pNextNode )
CharAttribList::DbgCheckAttribs(pNextNode->aCharAttribList);
#endif
- sal_Int32 nAttr = 0;
+ std::size_t nAttr = 0;
CharAttribList::AttribsType& rNextAttribs = pNextNode->GetCharAttribs().GetAttribs();
EditCharAttrib* pAttrib = GetAttrib(rNextAttribs, nAttr);
while ( pAttrib )
@@ -1512,10 +1517,11 @@ void ContentNode::AppendAttribs( ContentNode* pNextNode )
if ( ( pAttrib->GetStart() == 0 ) && ( !pAttrib->IsFeature() ) )
{
// Attributes can possibly be summarized as:
- sal_Int32 nTmpAttr = 0;
+ std::size_t nTmpAttr = 0;
EditCharAttrib* pTmpAttrib = GetAttrib( aCharAttribList.GetAttribs(), nTmpAttr );
while ( !bMelted && pTmpAttrib )
{
+ ++nTmpAttr;
if ( pTmpAttrib->GetEnd() == nNewStart )
{
if (pTmpAttrib->Which() == pAttrib->Which())
@@ -1532,12 +1538,11 @@ void ContentNode::AppendAttribs( ContentNode* pNextNode )
}
else if (0 == pTmpAttrib->GetLen())
{
+ --nTmpAttr; // to cancel earlier increment...
aCharAttribList.Remove(nTmpAttr);
- --nTmpAttr; // to cancel later increment...
}
}
}
- ++nTmpAttr;
pTmpAttrib = GetAttrib( aCharAttribList.GetAttribs(), nTmpAttr );
}
}
@@ -2425,7 +2430,7 @@ bool EditDoc::RemoveAttribs( ContentNode* pNode, sal_Int32 nStart, sal_Int32 nEn
#endif
// iterate over the attributes ...
- sal_Int32 nAttr = 0;
+ std::size_t nAttr = 0;
CharAttribList::AttribsType& rAttribs = pNode->GetCharAttribs().GetAttribs();
EditCharAttrib* pAttr = GetAttrib(rAttribs, nAttr);
while ( pAttr )
@@ -2505,9 +2510,11 @@ bool EditDoc::RemoveAttribs( ContentNode* pNode, sal_Int32 nStart, sal_Int32 nEn
DBG_ASSERT( !pAttr->IsFeature(), "RemoveAttribs: Remove a feature?!" );
GetItemPool().Remove( *pAttr->GetItem() );
rAttribs.erase(rAttribs.begin()+nAttr);
- nAttr--;
}
- nAttr++;
+ else
+ {
+ nAttr++;
+ }
pAttr = GetAttrib(rAttribs, nAttr);
}
@@ -2585,7 +2592,7 @@ void EditDoc::FindAttribs( ContentNode* pNode, sal_Int32 nStartPos, sal_Int32 nE
assert(pNode);
DBG_ASSERT( nStartPos <= nEndPos, "Invalid region!" );
- sal_uInt16 nAttr = 0;
+ std::size_t nAttr = 0;
EditCharAttrib* pAttr = GetAttrib( pNode->GetCharAttribs().GetAttribs(), nAttr );
// No Selection...
if ( nStartPos == nEndPos )
diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx
index ff4356c8aa75..14525b494ea0 100644
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -69,6 +69,7 @@
#include <o3tl/sorted_vector.hxx>
#include <osl/diagnose.h>
#include <comphelper/string.hxx>
+#include <cstddef>
#include <memory>
#include <set>
@@ -2412,7 +2413,7 @@ void ImpEditEngine::CreateTextPortions( ParaPortion* pParaPortion, sal_Int32& rS
o3tl::sorted_vector< sal_Int32 > aPositions;
aPositions.insert( 0 );
- for (sal_uInt16 nAttr = 0;; ++nAttr)
+ for (std::size_t nAttr = 0;; ++nAttr)
{
// Insert Start and End into the Array...
// The Insert method does not allow for duplicate values...
diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx
index 35b6f6291687..6520b0034727 100644
--- a/editeng/source/editeng/impedit4.cxx
+++ b/editeng/source/editeng/impedit4.cxx
@@ -72,6 +72,7 @@
#include <svtools/rtfkeywd.hxx>
#include <editeng/edtdlg.hxx>
+#include <cstddef>
#include <memory>
#include <unordered_map>
#include <vector>
@@ -247,7 +248,7 @@ bool ImpEditEngine::WriteItemListAsRTF( ItemList& rLst, SvStream& rOutput, sal_I
static void lcl_FindValidAttribs( ItemList& rLst, ContentNode* pNode, sal_Int32 nIndex, sal_uInt16 nScriptType )
{
- sal_uInt16 nAttr = 0;
+ std::size_t nAttr = 0;
EditCharAttrib* pAttr = GetAttrib( pNode->GetCharAttribs().GetAttribs(), nAttr );
while ( pAttr && ( pAttr->GetStart() <= nIndex ) )
{
@@ -1040,7 +1041,7 @@ std::unique_ptr<EditTextObject> ImpEditEngine::CreateTextObject( EditSelection a
auto& rCAttriblist = pC->GetCharAttribs();
// and the Attribute...
- sal_uInt16 nAttr = 0;
+ std::size_t nAttr = 0;
EditCharAttrib* pAttr = GetAttrib( pNode->GetCharAttribs().GetAttribs(), nAttr );
while ( pAttr )
{