[Scummvm-git-logs] scummvm master -> cdc8d16fd55d7cdb84ce228048487daaf91837ed

scemino noreply at scummvm.org
Tue Mar 19 20:02:16 UTC 2024


This automated email contains information about 21 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
1f47c542d0 TWP: Fix not all members of a class are initialized in clipper. PVS-Studio V730
4c4a938b90 TWP: Remove unused code in clipper
f3130c4921 TWP: Fix calling the 'Clear' virtual function in the destructor of ClipperBase. PVS-Studio V1053
5bbe512189 TWP: Fix recurring check in clipper. PVS-Studio V571
9c5e5f2c83 TWP: Fix the 'succeeded' variable was assigned the same value in clipper. PVS-Studio V1048
b765b43881 TWP: Fix the 'j->OutPt1' variable was assigned the same value in clipper. PVS-Studio V1048
f487c0216f TWP: Fix An unconditional 'return' within a loop in squirrel. PVS-Studio V612
15df97fce9 TWP: Fix calling the 'Finalize' virtual function in the destructor in SQClass. PVS-Studio V1053
14301e272e TWP: Fix pointer to local variable 'funcstate' is stored outside the scope of this variable in squirrel. PVS-Studio V506
c613a94ddc TWP: Fix A part of conditional expression is always true or false in squirrel. PVS-Studio V560
4c3e77e568 TWP: Fix a variable is assigned to itself in squirrel. PVS-Studio V560
6d84bf32a7 TWP: Fix unreachable code detected in squirrel. PVS-Studio V779
f461e4bdca TWP: Fix the 'ci' pointer was utilized before it was verified against nullptr in squirrel. PVS-Studio V595
3f80e4a24b TWP: Fix calling the 'Finalize' virtual function in the destructor in SQVM. PVS-Studio V1053
2e823bc6f6 TWP: Fix excessive checks can be simplified in squirrel. PVS-Studio V728
df0d1cb8d4 TWP: Fix not all members of a class are initialized in squirrel. PVS-Studio V730
d4b3907d84 TWP: Fix variables were assigned the same value. in squirrel. PVS-Studio V1048
aeee6ccc17 TWP: Fix array underrun is possible. The value of 'fpos' index could reach -1 in squirrel. PVS-Studio V557
827b7ae5a8 TWP: Fix 'sqvector' lacks the copy assignment operator in squirrel. PVS-Studio V690
2cc5615042 TWP: Fix 'sqvector' constructor contains potentially uninitialized members in squirrel. PVS-Studio V1077
cdc8d16fd5 TWP: Fix '_sharedstate' overwrites field in base class in squirrel. PVS-Studio V703


Commit: 1f47c542d0e617e20bfbf75534f5fdeef8be5cfc
    https://github.com/scummvm/scummvm/commit/1f47c542d0e617e20bfbf75534f5fdeef8be5cfc
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix not all members of a class are initialized in clipper. PVS-Studio V730

Changed paths:
    engines/twp/clipper/clipper.cpp


diff --git a/engines/twp/clipper/clipper.cpp b/engines/twp/clipper/clipper.cpp
index 1c52b148750..9490f8c1502 100644
--- a/engines/twp/clipper/clipper.cpp
+++ b/engines/twp/clipper/clipper.cpp
@@ -169,7 +169,7 @@ int PolyTree::Total() const {
 // PolyNode methods ...
 //------------------------------------------------------------------------------
 
-PolyNode::PolyNode() : Parent(0), Index(0), m_IsOpen(false) {
+PolyNode::PolyNode() : Parent(0), Index(0), m_IsOpen(false), m_jointype(jtSquare), m_endtype(etClosedPolygon) {
 }
 //------------------------------------------------------------------------------
 
@@ -829,7 +829,7 @@ bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) {
 // ClipperBase class methods ...
 //------------------------------------------------------------------------------
 
-ClipperBase::ClipperBase() // constructor
+ClipperBase::ClipperBase(): m_PreserveCollinear(false), m_HasOpenPaths(false), m_ActiveEdges(nullptr) // constructor
 {
 	m_CurrentLM = m_MinimaList.begin(); // begin() == end() here
 	m_UseFullRange = false;
@@ -1416,7 +1416,13 @@ bool ClipperBase::LocalMinimaPending() {
 // TClipper methods ...
 //------------------------------------------------------------------------------
 
-Clipper::Clipper(int initOptions) : ClipperBase() // constructor
+Clipper::Clipper(int initOptions) :
+ClipperBase(),
+m_ClipType(ctIntersection),
+m_SortedEdges(nullptr),
+m_ClipFillType(pftEvenOdd),
+m_SubjFillType(pftEvenOdd),
+m_UsingPolyTree(false)
 {
 	m_ExecuteLocked = false;
 	m_UseFullRange = false;


Commit: 4c4a938b906a8c19d6ebae1bd6cad056f3f7e111
    https://github.com/scummvm/scummvm/commit/4c4a938b906a8c19d6ebae1bd6cad056f3f7e111
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Remove unused code in clipper

Changed paths:
    engines/twp/clipper/clipper.cpp
    engines/twp/clipper/clipper.hpp


diff --git a/engines/twp/clipper/clipper.cpp b/engines/twp/clipper/clipper.cpp
index 9490f8c1502..62de522c35d 100644
--- a/engines/twp/clipper/clipper.cpp
+++ b/engines/twp/clipper/clipper.cpp
@@ -43,10 +43,6 @@
 
 namespace ClipperLib {
 
-static double const pi = 3.141592653589793238;
-static double const two_pi = pi * 2;
-static double const def_arc_tolerance = 0.25;
-
 enum Direction { dRightToLeft,
 				 dLeftToRight };
 
@@ -137,34 +133,6 @@ inline cInt Abs(cInt val) {
 	return val < 0 ? -val : val;
 }
 
-//------------------------------------------------------------------------------
-// PolyTree methods ...
-//------------------------------------------------------------------------------
-
-void PolyTree::Clear() {
-	for (PolyNodes::size_type i = 0; i < AllNodes.size(); ++i)
-		delete AllNodes[i];
-	AllNodes.resize(0);
-	Childs.resize(0);
-}
-//------------------------------------------------------------------------------
-
-PolyNode *PolyTree::GetFirst() const {
-	if (!Childs.empty())
-		return Childs[0];
-	else
-		return 0;
-}
-//------------------------------------------------------------------------------
-
-int PolyTree::Total() const {
-	int result = (int)AllNodes.size();
-	// with negative offsets, ignore the hidden outer polygon ...
-	if (result > 0 && Childs[0] != AllNodes[0])
-		result--;
-	return result;
-}
-
 //------------------------------------------------------------------------------
 // PolyNode methods ...
 //------------------------------------------------------------------------------
@@ -1436,23 +1404,11 @@ m_UsingPolyTree(false)
 }
 //------------------------------------------------------------------------------
 
-#ifdef use_xyz
-void Clipper::ZFillFunction(ZFillCallback zFillFunc) {
-	m_ZFill = zFillFunc;
-}
-//------------------------------------------------------------------------------
-#endif
-
 bool Clipper::Execute(ClipType clipType, Paths &solution, PolyFillType fillType) {
 	return Execute(clipType, solution, fillType, fillType);
 }
 //------------------------------------------------------------------------------
 
-bool Clipper::Execute(ClipType clipType, PolyTree &polytree, PolyFillType fillType) {
-	return Execute(clipType, polytree, fillType, fillType);
-}
-//------------------------------------------------------------------------------
-
 bool Clipper::Execute(ClipType clipType, Paths &solution,
 					  PolyFillType subjFillType, PolyFillType clipFillType) {
 	if (m_ExecuteLocked)
@@ -1474,24 +1430,6 @@ bool Clipper::Execute(ClipType clipType, Paths &solution,
 }
 //------------------------------------------------------------------------------
 
-bool Clipper::Execute(ClipType clipType, PolyTree &polytree,
-					  PolyFillType subjFillType, PolyFillType clipFillType) {
-	if (m_ExecuteLocked)
-		return false;
-	m_ExecuteLocked = true;
-	m_SubjFillType = subjFillType;
-	m_ClipFillType = clipFillType;
-	m_ClipType = clipType;
-	m_UsingPolyTree = true;
-	bool succeeded = ExecuteInternal();
-	if (succeeded)
-		BuildResult2(polytree);
-	DisposeAllOutRecs();
-	m_ExecuteLocked = false;
-	return succeeded;
-}
-//------------------------------------------------------------------------------
-
 void Clipper::FixHoleLinkage(OutRec &outrec) {
 	// skip OutRecs that (a) contain outermost polygons or
 	//(b) already have the correct owner/child linkage ...
@@ -3035,45 +2973,45 @@ void Clipper::BuildResult(Paths &polys) {
 }
 //------------------------------------------------------------------------------
 
-void Clipper::BuildResult2(PolyTree &polytree) {
-	polytree.Clear();
-	polytree.AllNodes.reserve(m_PolyOuts.size());
-	// add each output polygon/contour to polytree ...
-	for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) {
-		OutRec *outRec = m_PolyOuts[i];
-		int cnt = PointCount(outRec->Pts);
-		if ((outRec->IsOpen && cnt < 2) || (!outRec->IsOpen && cnt < 3))
-			continue;
-		FixHoleLinkage(*outRec);
-		PolyNode *pn = new PolyNode();
-		// nb: polytree takes ownership of all the PolyNodes
-		polytree.AllNodes.push_back(pn);
-		outRec->PolyNd = pn;
-		pn->Parent = 0;
-		pn->Index = 0;
-		pn->Contour.reserve(cnt);
-		OutPt *op = outRec->Pts->Prev;
-		for (int j = 0; j < cnt; j++) {
-			pn->Contour.push_back(op->Pt);
-			op = op->Prev;
-		}
-	}
-
-	// fixup PolyNode links etc ...
-	polytree.Childs.reserve(m_PolyOuts.size());
-	for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) {
-		OutRec *outRec = m_PolyOuts[i];
-		if (!outRec->PolyNd)
-			continue;
-		if (outRec->IsOpen) {
-			outRec->PolyNd->m_IsOpen = true;
-			polytree.AddChild(*outRec->PolyNd);
-		} else if (outRec->FirstLeft && outRec->FirstLeft->PolyNd)
-			outRec->FirstLeft->PolyNd->AddChild(*outRec->PolyNd);
-		else
-			polytree.AddChild(*outRec->PolyNd);
-	}
-}
+// void Clipper::BuildResult2(PolyTree &polytree) {
+// 	polytree.Clear();
+// 	polytree.AllNodes.reserve(m_PolyOuts.size());
+// 	// add each output polygon/contour to polytree ...
+// 	for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) {
+// 		OutRec *outRec = m_PolyOuts[i];
+// 		int cnt = PointCount(outRec->Pts);
+// 		if ((outRec->IsOpen && cnt < 2) || (!outRec->IsOpen && cnt < 3))
+// 			continue;
+// 		FixHoleLinkage(*outRec);
+// 		PolyNode *pn = new PolyNode();
+// 		// nb: polytree takes ownership of all the PolyNodes
+// 		polytree.AllNodes.push_back(pn);
+// 		outRec->PolyNd = pn;
+// 		pn->Parent = 0;
+// 		pn->Index = 0;
+// 		pn->Contour.reserve(cnt);
+// 		OutPt *op = outRec->Pts->Prev;
+// 		for (int j = 0; j < cnt; j++) {
+// 			pn->Contour.push_back(op->Pt);
+// 			op = op->Prev;
+// 		}
+// 	}
+
+// 	// fixup PolyNode links etc ...
+// 	polytree.Childs.reserve(m_PolyOuts.size());
+// 	for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) {
+// 		OutRec *outRec = m_PolyOuts[i];
+// 		if (!outRec->PolyNd)
+// 			continue;
+// 		if (outRec->IsOpen) {
+// 			outRec->PolyNd->m_IsOpen = true;
+// 			polytree.AddChild(*outRec->PolyNd);
+// 		} else if (outRec->FirstLeft && outRec->FirstLeft->PolyNd)
+// 			outRec->FirstLeft->PolyNd->AddChild(*outRec->PolyNd);
+// 		else
+// 			polytree.AddChild(*outRec->PolyNd);
+// 	}
+// }
 //------------------------------------------------------------------------------
 
 void SwapIntersectNodes(IntersectNode &int1, IntersectNode &int2) {
@@ -3554,428 +3492,6 @@ void Clipper::JoinCommonEdges() {
 	}
 }
 
-//------------------------------------------------------------------------------
-// ClipperOffset support functions ...
-//------------------------------------------------------------------------------
-
-DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2) {
-	if (pt2.X == pt1.X && pt2.Y == pt1.Y)
-		return DoublePoint(0, 0);
-
-	double Dx = (double)(pt2.X - pt1.X);
-	double dy = (double)(pt2.Y - pt1.Y);
-	double f = 1 * 1.0 / sqrt(Dx * Dx + dy * dy);
-	Dx *= f;
-	dy *= f;
-	return DoublePoint(dy, -Dx);
-}
-
-//------------------------------------------------------------------------------
-// ClipperOffset class
-//------------------------------------------------------------------------------
-
-ClipperOffset::ClipperOffset(double miterLimit, double arcTolerance) {
-	MiterLimit = miterLimit;
-	ArcTolerance = arcTolerance;
-	m_lowest.X = -1;
-}
-//------------------------------------------------------------------------------
-
-ClipperOffset::~ClipperOffset() {
-	Clear();
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::Clear() {
-	for (int i = 0; i < m_polyNodes.ChildCount(); ++i)
-		delete m_polyNodes.Childs[i];
-	m_polyNodes.Childs.clear();
-	m_lowest.X = -1;
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::AddPath(const Path &path, JoinType joinType, EndType endType) {
-	int highI = (int)path.size() - 1;
-	if (highI < 0)
-		return;
-	PolyNode *newNode = new PolyNode();
-	newNode->m_jointype = joinType;
-	newNode->m_endtype = endType;
-
-	// strip duplicate points from path and also get index to the lowest point ...
-	if (endType == etClosedLine || endType == etClosedPolygon)
-		while (highI > 0 && path[0] == path[highI])
-			highI--;
-	newNode->Contour.reserve(highI + 1);
-	newNode->Contour.push_back(path[0]);
-	int j = 0, k = 0;
-	for (int i = 1; i <= highI; i++)
-		if (newNode->Contour[j] != path[i]) {
-			j++;
-			newNode->Contour.push_back(path[i]);
-			if (path[i].Y > newNode->Contour[k].Y ||
-				(path[i].Y == newNode->Contour[k].Y &&
-				 path[i].X < newNode->Contour[k].X))
-				k = j;
-		}
-	if (endType == etClosedPolygon && j < 2) {
-		delete newNode;
-		return;
-	}
-	m_polyNodes.AddChild(*newNode);
-
-	// if this path's lowest pt is lower than all the others then update m_lowest
-	if (endType != etClosedPolygon)
-		return;
-	if (m_lowest.X < 0)
-		m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k);
-	else {
-		IntPoint ip = m_polyNodes.Childs[(int)m_lowest.X]->Contour[(int)m_lowest.Y];
-		if (newNode->Contour[k].Y > ip.Y ||
-			(newNode->Contour[k].Y == ip.Y &&
-			 newNode->Contour[k].X < ip.X))
-			m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k);
-	}
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::AddPaths(const Paths &paths, JoinType joinType, EndType endType) {
-	for (Paths::size_type i = 0; i < paths.size(); ++i)
-		AddPath(paths[i], joinType, endType);
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::FixOrientations() {
-	// fixup orientations of all closed paths if the orientation of the
-	// closed path with the lowermost vertex is wrong ...
-	if (m_lowest.X >= 0 &&
-		!Orientation(m_polyNodes.Childs[(int)m_lowest.X]->Contour)) {
-		for (int i = 0; i < m_polyNodes.ChildCount(); ++i) {
-			PolyNode &node = *m_polyNodes.Childs[i];
-			if (node.m_endtype == etClosedPolygon ||
-				(node.m_endtype == etClosedLine && Orientation(node.Contour)))
-				ReversePath(node.Contour);
-		}
-	} else {
-		for (int i = 0; i < m_polyNodes.ChildCount(); ++i) {
-			PolyNode &node = *m_polyNodes.Childs[i];
-			if (node.m_endtype == etClosedLine && !Orientation(node.Contour))
-				ReversePath(node.Contour);
-		}
-	}
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::Execute(Paths &solution, double delta) {
-	solution.clear();
-	FixOrientations();
-	DoOffset(delta);
-
-	// now clean up 'corners' ...
-	Clipper clpr;
-	clpr.AddPaths(m_destPolys, ptSubject, true);
-	if (delta > 0) {
-		clpr.Execute(ctUnion, solution, pftPositive, pftPositive);
-	} else {
-		IntRect r = clpr.GetBounds();
-		Path outer(4);
-		outer[0] = IntPoint(r.left - 10, r.bottom + 10);
-		outer[1] = IntPoint(r.right + 10, r.bottom + 10);
-		outer[2] = IntPoint(r.right + 10, r.top - 10);
-		outer[3] = IntPoint(r.left - 10, r.top - 10);
-
-		clpr.AddPath(outer, ptSubject, true);
-		clpr.ReverseSolution(true);
-		clpr.Execute(ctUnion, solution, pftNegative, pftNegative);
-		if (solution.size() > 0)
-			solution.erase(solution.begin());
-	}
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::Execute(PolyTree &solution, double delta) {
-	solution.Clear();
-	FixOrientations();
-	DoOffset(delta);
-
-	// now clean up 'corners' ...
-	Clipper clpr;
-	clpr.AddPaths(m_destPolys, ptSubject, true);
-	if (delta > 0) {
-		clpr.Execute(ctUnion, solution, pftPositive, pftPositive);
-	} else {
-		IntRect r = clpr.GetBounds();
-		Path outer(4);
-		outer[0] = IntPoint(r.left - 10, r.bottom + 10);
-		outer[1] = IntPoint(r.right + 10, r.bottom + 10);
-		outer[2] = IntPoint(r.right + 10, r.top - 10);
-		outer[3] = IntPoint(r.left - 10, r.top - 10);
-
-		clpr.AddPath(outer, ptSubject, true);
-		clpr.ReverseSolution(true);
-		clpr.Execute(ctUnion, solution, pftNegative, pftNegative);
-		// remove the outer PolyNode rectangle ...
-		if (solution.ChildCount() == 1 && solution.Childs[0]->ChildCount() > 0) {
-			PolyNode *outerNode = solution.Childs[0];
-			solution.Childs.reserve(outerNode->ChildCount());
-			solution.Childs[0] = outerNode->Childs[0];
-			solution.Childs[0]->Parent = outerNode->Parent;
-			for (int i = 1; i < outerNode->ChildCount(); ++i)
-				solution.AddChild(*outerNode->Childs[i]);
-		} else
-			solution.Clear();
-	}
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::DoOffset(double delta) {
-	m_destPolys.clear();
-	m_delta = delta;
-
-	// if Zero offset, just copy any CLOSED polygons to m_p and return ...
-	if (NEAR_ZERO(delta)) {
-		m_destPolys.reserve(m_polyNodes.ChildCount());
-		for (int i = 0; i < m_polyNodes.ChildCount(); i++) {
-			PolyNode &node = *m_polyNodes.Childs[i];
-			if (node.m_endtype == etClosedPolygon)
-				m_destPolys.push_back(node.Contour);
-		}
-		return;
-	}
-
-	// see offset_triginometry3.svg in the documentation folder ...
-	if (MiterLimit > 2)
-		m_miterLim = 2 / (MiterLimit * MiterLimit);
-	else
-		m_miterLim = 0.5;
-
-	double y;
-	if (ArcTolerance <= 0.0)
-		y = def_arc_tolerance;
-	else if (ArcTolerance > fabs(delta) * def_arc_tolerance)
-		y = fabs(delta) * def_arc_tolerance;
-	else
-		y = ArcTolerance;
-	// see offset_triginometry2.svg in the documentation folder ...
-	double steps = pi / acos(1 - y / fabs(delta));
-	if (steps > fabs(delta) * pi)
-		steps = fabs(delta) * pi; // ie excessive precision check
-	m_sin = sin(two_pi / steps);
-	m_cos = cos(two_pi / steps);
-	m_StepsPerRad = steps / two_pi;
-	if (delta < 0.0)
-		m_sin = -m_sin;
-
-	m_destPolys.reserve(m_polyNodes.ChildCount() * 2);
-	for (int i = 0; i < m_polyNodes.ChildCount(); i++) {
-		PolyNode &node = *m_polyNodes.Childs[i];
-		m_srcPoly = node.Contour;
-
-		int len = (int)m_srcPoly.size();
-		if (len == 0 || (delta <= 0 && (len < 3 || node.m_endtype != etClosedPolygon)))
-			continue;
-
-		m_destPoly.clear();
-		if (len == 1) {
-			if (node.m_jointype == jtRound) {
-				double X = 1.0, Y = 0.0;
-				for (cInt j = 1; j <= steps; j++) {
-					m_destPoly.push_back(IntPoint(
-						Round(m_srcPoly[0].X + X * delta),
-						Round(m_srcPoly[0].Y + Y * delta)));
-					double X2 = X;
-					X = X * m_cos - m_sin * Y;
-					Y = X2 * m_sin + Y * m_cos;
-				}
-			} else {
-				double X = -1.0, Y = -1.0;
-				for (int j = 0; j < 4; ++j) {
-					m_destPoly.push_back(IntPoint(
-						Round(m_srcPoly[0].X + X * delta),
-						Round(m_srcPoly[0].Y + Y * delta)));
-					if (X < 0)
-						X = 1;
-					else if (Y < 0)
-						Y = 1;
-					else
-						X = -1;
-				}
-			}
-			m_destPolys.push_back(m_destPoly);
-			continue;
-		}
-		// build m_normals ...
-		m_normals.clear();
-		m_normals.reserve(len);
-		for (int j = 0; j < len - 1; ++j)
-			m_normals.push_back(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1]));
-		if (node.m_endtype == etClosedLine || node.m_endtype == etClosedPolygon)
-			m_normals.push_back(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0]));
-		else
-			m_normals.push_back(DoublePoint(m_normals[len - 2]));
-
-		if (node.m_endtype == etClosedPolygon) {
-			int k = len - 1;
-			for (int j = 0; j < len; ++j)
-				OffsetPoint(j, k, node.m_jointype);
-			m_destPolys.push_back(m_destPoly);
-		} else if (node.m_endtype == etClosedLine) {
-			int k = len - 1;
-			for (int j = 0; j < len; ++j)
-				OffsetPoint(j, k, node.m_jointype);
-			m_destPolys.push_back(m_destPoly);
-			m_destPoly.clear();
-			// re-build m_normals ...
-			DoublePoint n = m_normals[len - 1];
-			for (int j = len - 1; j > 0; j--)
-				m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y);
-			m_normals[0] = DoublePoint(-n.X, -n.Y);
-			k = 0;
-			for (int j = len - 1; j >= 0; j--)
-				OffsetPoint(j, k, node.m_jointype);
-			m_destPolys.push_back(m_destPoly);
-		} else {
-			int k = 0;
-			for (int j = 1; j < len - 1; ++j)
-				OffsetPoint(j, k, node.m_jointype);
-
-			IntPoint pt1;
-			if (node.m_endtype == etOpenButt) {
-				int j = len - 1;
-				pt1 = IntPoint((cInt)Round(m_srcPoly[j].X + m_normals[j].X *
-																delta),
-							   (cInt)Round(m_srcPoly[j].Y + m_normals[j].Y * delta));
-				m_destPoly.push_back(pt1);
-				pt1 = IntPoint((cInt)Round(m_srcPoly[j].X - m_normals[j].X *
-																delta),
-							   (cInt)Round(m_srcPoly[j].Y - m_normals[j].Y * delta));
-				m_destPoly.push_back(pt1);
-			} else {
-				int j = len - 1;
-				k = len - 2;
-				m_sinA = 0;
-				m_normals[j] = DoublePoint(-m_normals[j].X, -m_normals[j].Y);
-				if (node.m_endtype == etOpenSquare)
-					DoSquare(j, k);
-				else
-					DoRound(j, k);
-			}
-
-			// re-build m_normals ...
-			for (int j = len - 1; j > 0; j--)
-				m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y);
-			m_normals[0] = DoublePoint(-m_normals[1].X, -m_normals[1].Y);
-
-			k = len - 1;
-			for (int j = k - 1; j > 0; --j)
-				OffsetPoint(j, k, node.m_jointype);
-
-			if (node.m_endtype == etOpenButt) {
-				pt1 = IntPoint((cInt)Round(m_srcPoly[0].X - m_normals[0].X * delta),
-							   (cInt)Round(m_srcPoly[0].Y - m_normals[0].Y * delta));
-				m_destPoly.push_back(pt1);
-				pt1 = IntPoint((cInt)Round(m_srcPoly[0].X + m_normals[0].X * delta),
-							   (cInt)Round(m_srcPoly[0].Y + m_normals[0].Y * delta));
-				m_destPoly.push_back(pt1);
-			} else {
-				k = 1;
-				m_sinA = 0;
-				if (node.m_endtype == etOpenSquare)
-					DoSquare(0, 1);
-				else
-					DoRound(0, 1);
-			}
-			m_destPolys.push_back(m_destPoly);
-		}
-	}
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::OffsetPoint(int j, int &k, JoinType jointype) {
-	// cross product ...
-	m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y);
-	if (fabs(m_sinA * m_delta) < 1.0) {
-		// dot product ...
-		double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y);
-		if (cosA > 0) // angle => 0 degrees
-		{
-			m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta),
-										  Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta)));
-			return;
-		}
-		// else angle => 180 degrees
-	} else if (m_sinA > 1.0)
-		m_sinA = 1.0;
-	else if (m_sinA < -1.0)
-		m_sinA = -1.0;
-
-	if (m_sinA * m_delta < 0) {
-		m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta),
-									  Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta)));
-		m_destPoly.push_back(m_srcPoly[j]);
-		m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * m_delta),
-									  Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta)));
-	} else
-		switch (jointype) {
-		case jtMiter: {
-			double r = 1 + (m_normals[j].X * m_normals[k].X +
-							m_normals[j].Y * m_normals[k].Y);
-			if (r >= m_miterLim)
-				DoMiter(j, k, r);
-			else
-				DoSquare(j, k);
-			break;
-		}
-		case jtSquare:
-			DoSquare(j, k);
-			break;
-		case jtRound:
-			DoRound(j, k);
-			break;
-		}
-	k = j;
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::DoSquare(int j, int k) {
-	double dx = tan(atan2(m_sinA,
-						  m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) /
-					4);
-	m_destPoly.push_back(IntPoint(
-		Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)),
-		Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx))));
-	m_destPoly.push_back(IntPoint(
-		Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)),
-		Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx))));
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::DoMiter(int j, int k, double r) {
-	double q = m_delta / r;
-	m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q),
-								  Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q)));
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::DoRound(int j, int k) {
-	double a = atan2(m_sinA,
-					 m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y);
-	int steps = MAX((int)Round(m_StepsPerRad * fabs(a)), 1);
-
-	double X = m_normals[k].X, Y = m_normals[k].Y, X2;
-	for (int i = 0; i < steps; ++i) {
-		m_destPoly.push_back(IntPoint(
-			Round(m_srcPoly[j].X + X * m_delta),
-			Round(m_srcPoly[j].Y + Y * m_delta)));
-		X2 = X;
-		X = X * m_cos - m_sin * Y;
-		Y = X2 * m_sin + Y * m_cos;
-	}
-	m_destPoly.push_back(IntPoint(
-		Round(m_srcPoly[j].X + m_normals[j].X * m_delta),
-		Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta)));
-}
-
 //------------------------------------------------------------------------------
 // Miscellaneous public functions
 //------------------------------------------------------------------------------
@@ -4050,25 +3566,25 @@ void ReversePaths(Paths &p) {
 }
 //------------------------------------------------------------------------------
 
-void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType) {
-	Clipper c;
-	c.StrictlySimple(true);
-	c.AddPath(in_poly, ptSubject, true);
-	c.Execute(ctUnion, out_polys, fillType, fillType);
-}
-//------------------------------------------------------------------------------
+// void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType) {
+// 	Clipper c;
+// 	c.StrictlySimple(true);
+// 	c.AddPath(in_poly, ptSubject, true);
+// 	c.Execute(ctUnion, out_polys, fillType, fillType);
+// }
+// //------------------------------------------------------------------------------
 
-void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType) {
-	Clipper c;
-	c.StrictlySimple(true);
-	c.AddPaths(in_polys, ptSubject, true);
-	c.Execute(ctUnion, out_polys, fillType, fillType);
-}
-//------------------------------------------------------------------------------
+// void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType) {
+// 	Clipper c;
+// 	c.StrictlySimple(true);
+// 	c.AddPaths(in_polys, ptSubject, true);
+// 	c.Execute(ctUnion, out_polys, fillType, fillType);
+// }
+// //------------------------------------------------------------------------------
 
-void SimplifyPolygons(Paths &polys, PolyFillType fillType) {
-	SimplifyPolygons(polys, polys, fillType);
-}
+// void SimplifyPolygons(Paths &polys, PolyFillType fillType) {
+// 	SimplifyPolygons(polys, polys, fillType);
+// }
 //------------------------------------------------------------------------------
 
 inline double DistanceSqrd(const IntPoint &pt1, const IntPoint &pt2) {
@@ -4133,72 +3649,6 @@ OutPt *ExcludeOp(OutPt *op) {
 }
 //------------------------------------------------------------------------------
 
-void CleanPolygon(const Path &in_poly, Path &out_poly, double distance) {
-	// distance = proximity in units/pixels below which vertices
-	// will be stripped. Default ~= sqrt(2).
-
-	size_t size = in_poly.size();
-
-	if (size == 0) {
-		out_poly.clear();
-		return;
-	}
-
-	OutPt *outPts = new OutPt[size];
-	for (size_t i = 0; i < size; ++i) {
-		outPts[i].Pt = in_poly[i];
-		outPts[i].Next = &outPts[(i + 1) % size];
-		outPts[i].Next->Prev = &outPts[i];
-		outPts[i].Idx = 0;
-	}
-
-	double distSqrd = distance * distance;
-	OutPt *op = &outPts[0];
-	while (op->Idx == 0 && op->Next != op->Prev) {
-		if (PointsAreClose(op->Pt, op->Prev->Pt, distSqrd)) {
-			op = ExcludeOp(op);
-			size--;
-		} else if (PointsAreClose(op->Prev->Pt, op->Next->Pt, distSqrd)) {
-			ExcludeOp(op->Next);
-			op = ExcludeOp(op);
-			size -= 2;
-		} else if (SlopesNearCollinear(op->Prev->Pt, op->Pt, op->Next->Pt, distSqrd)) {
-			op = ExcludeOp(op);
-			size--;
-		} else {
-			op->Idx = 1;
-			op = op->Next;
-		}
-	}
-
-	if (size < 3)
-		size = 0;
-	out_poly.resize(size);
-	for (size_t i = 0; i < size; ++i) {
-		out_poly[i] = op->Pt;
-		op = op->Next;
-	}
-	delete[] outPts;
-}
-//------------------------------------------------------------------------------
-
-void CleanPolygon(Path &poly, double distance) {
-	CleanPolygon(poly, poly, distance);
-}
-//------------------------------------------------------------------------------
-
-void CleanPolygons(const Paths &in_polys, Paths &out_polys, double distance) {
-	out_polys.resize(in_polys.size());
-	for (Paths::size_type i = 0; i < in_polys.size(); ++i)
-		CleanPolygon(in_polys[i], out_polys[i], distance);
-}
-//------------------------------------------------------------------------------
-
-void CleanPolygons(Paths &polys, double distance) {
-	CleanPolygons(polys, polys, distance);
-}
-//------------------------------------------------------------------------------
-
 void Minkowski(const Path &poly, const Path &path,
 			   Paths &solution, bool isSum, bool isClosed) {
 	int delta = (isClosed ? 1 : 0);
@@ -4240,12 +3690,12 @@ void Minkowski(const Path &poly, const Path &path,
 }
 //------------------------------------------------------------------------------
 
-void MinkowskiSum(const Path &pattern, const Path &path, Paths &solution, bool pathIsClosed) {
-	Minkowski(pattern, path, solution, true, pathIsClosed);
-	Clipper c;
-	c.AddPaths(solution, ptSubject, true);
-	c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
-}
+// void MinkowskiSum(const Path &pattern, const Path &path, Paths &solution, bool pathIsClosed) {
+// 	Minkowski(pattern, path, solution, true, pathIsClosed);
+// 	Clipper c;
+// 	c.AddPaths(solution, ptSubject, true);
+// 	c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
+// }
 //------------------------------------------------------------------------------
 
 void TranslatePath(const Path &input, Path &output, const IntPoint delta) {
@@ -4256,30 +3706,6 @@ void TranslatePath(const Path &input, Path &output, const IntPoint delta) {
 }
 //------------------------------------------------------------------------------
 
-void MinkowskiSum(const Path &pattern, const Paths &paths, Paths &solution, bool pathIsClosed) {
-	Clipper c;
-	for (size_t i = 0; i < paths.size(); ++i) {
-		Paths tmp;
-		Minkowski(pattern, paths[i], tmp, true, pathIsClosed);
-		c.AddPaths(tmp, ptSubject, true);
-		if (pathIsClosed) {
-			Path tmp2;
-			TranslatePath(paths[i], tmp2, pattern[0]);
-			c.AddPath(tmp2, ptClip, true);
-		}
-	}
-	c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
-}
-//------------------------------------------------------------------------------
-
-void MinkowskiDiff(const Path &poly1, const Path &poly2, Paths &solution) {
-	Minkowski(poly1, poly2, solution, false, true);
-	Clipper c;
-	c.AddPaths(solution, ptSubject, true);
-	c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
-}
-//------------------------------------------------------------------------------
-
 enum NodeType { ntAny,
 				ntOpen,
 				ntClosed };
@@ -4298,28 +3724,28 @@ void AddPolyNodeToPaths(const PolyNode &polynode, NodeType nodetype, Paths &path
 }
 //------------------------------------------------------------------------------
 
-void PolyTreeToPaths(const PolyTree &polytree, Paths &paths) {
-	paths.resize(0);
-	paths.reserve(polytree.Total());
-	AddPolyNodeToPaths(polytree, ntAny, paths);
-}
-//------------------------------------------------------------------------------
-
-void ClosedPathsFromPolyTree(const PolyTree &polytree, Paths &paths) {
-	paths.resize(0);
-	paths.reserve(polytree.Total());
-	AddPolyNodeToPaths(polytree, ntClosed, paths);
-}
-//------------------------------------------------------------------------------
-
-void OpenPathsFromPolyTree(PolyTree &polytree, Paths &paths) {
-	paths.resize(0);
-	paths.reserve(polytree.Total());
-	// Open paths are top level only, so ...
-	for (int i = 0; i < polytree.ChildCount(); ++i)
-		if (polytree.Childs[i]->IsOpen())
-			paths.push_back(polytree.Childs[i]->Contour);
-}
+// void PolyTreeToPaths(const PolyTree &polytree, Paths &paths) {
+// 	paths.resize(0);
+// 	paths.reserve(polytree.Total());
+// 	AddPolyNodeToPaths(polytree, ntAny, paths);
+// }
+// //------------------------------------------------------------------------------
+
+// void ClosedPathsFromPolyTree(const PolyTree &polytree, Paths &paths) {
+// 	paths.resize(0);
+// 	paths.reserve(polytree.Total());
+// 	AddPolyNodeToPaths(polytree, ntClosed, paths);
+// }
+// //------------------------------------------------------------------------------
+
+// void OpenPathsFromPolyTree(PolyTree &polytree, Paths &paths) {
+// 	paths.resize(0);
+// 	paths.reserve(polytree.Total());
+// 	// Open paths are top level only, so ...
+// 	for (int i = 0; i < polytree.ChildCount(); ++i)
+// 		if (polytree.Childs[i]->IsOpen())
+// 			paths.push_back(polytree.Childs[i]->Contour);
+// }
 //------------------------------------------------------------------------------
 
 } // namespace ClipperLib
diff --git a/engines/twp/clipper/clipper.hpp b/engines/twp/clipper/clipper.hpp
index 8598a9eccc4..7d8223dc2eb 100644
--- a/engines/twp/clipper/clipper.hpp
+++ b/engines/twp/clipper/clipper.hpp
@@ -179,10 +179,6 @@ struct DoublePoint {
 };
 //------------------------------------------------------------------------------
 
-#ifdef use_xyz
-typedef void (*ZFillCallback)(IntPoint& e1bot, IntPoint& e1top, IntPoint& e2bot, IntPoint& e2top, IntPoint& pt);
-#endif
-
 enum InitOptions { ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4 };
 enum JoinType { jtSquare, jtRound, jtMiter };
 enum EndType { etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound };
@@ -213,39 +209,10 @@ private:
   friend class ClipperOffset;
 };
 
-class PolyTree : public PolyNode {
-public:
-  ~PolyTree() { Clear(); };
-  PolyNode *GetFirst() const;
-  void Clear();
-  int Total() const;
-private:
-  //PolyTree& operator =(PolyTree& other);
-  PolyNodes AllNodes;
-  friend class Clipper; //to access AllNodes
-};
-
 bool Orientation(const Path &poly);
 double Area(const Path &poly);
 int PointInPolygon(const IntPoint &pt, const Path &path);
 
-void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
-void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
-void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd);
-
-void CleanPolygon(const Path &in_poly, Path &out_poly, double distance = 1.415);
-void CleanPolygon(Path &poly, double distance = 1.415);
-void CleanPolygons(const Paths &in_polys, Paths &out_polys, double distance = 1.415);
-void CleanPolygons(Paths &polys, double distance = 1.415);
-
-void MinkowskiSum(const Path &pattern, const Path &path, Paths &solution, bool pathIsClosed);
-void MinkowskiSum(const Path &pattern, const Paths &paths, Paths &solution, bool pathIsClosed);
-void MinkowskiDiff(const Path &poly1, const Path &poly2, Paths &solution);
-
-void PolyTreeToPaths(const PolyTree &polytree, Paths &paths);
-void ClosedPathsFromPolyTree(const PolyTree &polytree, Paths &paths);
-void OpenPathsFromPolyTree(PolyTree &polytree, Paths &paths);
-
 void ReversePath(Path &p);
 void ReversePaths(Paths &p);
 
@@ -284,7 +251,6 @@ public:
   void PreserveCollinear(bool value) { m_PreserveCollinear = value; };
 protected:
   void DisposeLocalMinimaList();
-  TEdge *AddBoundsToLML(TEdge *e, bool IsClosed);
   virtual void Reset();
   TEdge *ProcessBound(TEdge *E, bool IsClockwise);
   void InsertScanbeam(const cInt Y);
@@ -324,21 +290,11 @@ public:
                Paths &solution,
                PolyFillType subjFillType,
                PolyFillType clipFillType);
-  bool Execute(ClipType clipType,
-               PolyTree &polytree,
-               PolyFillType fillType = pftEvenOdd);
-  bool Execute(ClipType clipType,
-               PolyTree &polytree,
-               PolyFillType subjFillType,
-               PolyFillType clipFillType);
+
   bool ReverseSolution() { return m_ReverseOutput; };
   void ReverseSolution(bool value) { m_ReverseOutput = value; };
   bool StrictlySimple() { return m_StrictSimple; };
   void StrictlySimple(bool value) { m_StrictSimple = value; };
-  //set the callback function for z value filling on intersections (otherwise Z is 0)
-#ifdef use_xyz
-  void ZFillFunction(ZFillCallback zFillFunc);
-#endif
 protected:
   virtual bool ExecuteInternal();
 private:
@@ -355,9 +311,6 @@ private:
   bool m_ReverseOutput;
   bool m_UsingPolyTree;
   bool m_StrictSimple;
-#ifdef use_xyz
-  ZFillCallback   m_ZFill; //custom callback
-#endif
   void SetWindingCount(TEdge &edge);
   bool IsEvenOddFillType(const TEdge &edge) const;
   bool IsEvenOddAltFillType(const TEdge &edge) const;
@@ -369,7 +322,6 @@ private:
   void DeleteFromSEL(TEdge *e);
   void SwapPositionsInSEL(TEdge *edge1, TEdge *edge2);
   bool IsContributing(const TEdge &edge) const;
-  bool IsTopHorz(const cInt XPos);
   void DoMaxima(TEdge *e);
   void ProcessHorizontals();
   void ProcessHorizontal(TEdge *horzEdge);
@@ -385,14 +337,11 @@ private:
   void ProcessIntersectList();
   void ProcessEdgesAtTopOfScanbeam(const cInt topY);
   void BuildResult(Paths &polys);
-  void BuildResult2(PolyTree &polytree);
   void SetHoleState(TEdge *e, OutRec *outrec);
   void DisposeIntersectNodes();
   bool FixupIntersectionOrder();
   void FixupOutPolygon(OutRec &outrec);
   void FixupOutPolyline(OutRec &outrec);
-  bool IsHole(TEdge *e);
-  bool FindOwnerFromSplitRecs(OutRec &outRec, OutRec *&currOrfl);
   void FixHoleLinkage(OutRec &outrec);
   void AddJoin(OutPt *op1, OutPt *op2, const IntPoint offPt);
   void ClearJoins();
@@ -410,36 +359,6 @@ private:
 };
 //------------------------------------------------------------------------------
 
-class ClipperOffset {
-public:
-  ClipperOffset(double miterLimit = 2.0, double roundPrecision = 0.25);
-  ~ClipperOffset();
-  void AddPath(const Path &path, JoinType joinType, EndType endType);
-  void AddPaths(const Paths &paths, JoinType joinType, EndType endType);
-  void Execute(Paths &solution, double delta);
-  void Execute(PolyTree &solution, double delta);
-  void Clear();
-  double MiterLimit;
-  double ArcTolerance;
-private:
-  Paths m_destPolys;
-  Path m_srcPoly;
-  Path m_destPoly;
-  Common::Array<DoublePoint> m_normals;
-  double m_delta, m_sinA, m_sin, m_cos;
-  double m_miterLim, m_StepsPerRad;
-  IntPoint m_lowest;
-  PolyNode m_polyNodes;
-
-  void FixOrientations();
-  void DoOffset(double delta);
-  void OffsetPoint(int j, int &k, JoinType jointype);
-  void DoSquare(int j, int k);
-  void DoMiter(int j, int k, double r);
-  void DoRound(int j, int k);
-};
-//------------------------------------------------------------------------------
-
 } //ClipperLib namespace
 
 #endif //clipper_hpp


Commit: f3130c49218017a3fc38c12a8b9ddd47d5f552df
    https://github.com/scummvm/scummvm/commit/f3130c49218017a3fc38c12a8b9ddd47d5f552df
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix calling the 'Clear' virtual function in the destructor of ClipperBase. PVS-Studio V1053

Changed paths:
    engines/twp/clipper/clipper.hpp


diff --git a/engines/twp/clipper/clipper.hpp b/engines/twp/clipper/clipper.hpp
index 7d8223dc2eb..1a7173e4236 100644
--- a/engines/twp/clipper/clipper.hpp
+++ b/engines/twp/clipper/clipper.hpp
@@ -245,7 +245,7 @@ public:
   virtual ~ClipperBase();
   virtual bool AddPath(const Path &pg, PolyType PolyTyp, bool Closed);
   bool AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed);
-  virtual void Clear();
+  void Clear();
   IntRect GetBounds();
   bool PreserveCollinear() { return m_PreserveCollinear; };
   void PreserveCollinear(bool value) { m_PreserveCollinear = value; };


Commit: 5bbe5121890446c66d7cc2b86752f9d4926a37c9
    https://github.com/scummvm/scummvm/commit/5bbe5121890446c66d7cc2b86752f9d4926a37c9
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix recurring check in clipper. PVS-Studio V571

Changed paths:
    engines/twp/clipper/clipper.cpp


diff --git a/engines/twp/clipper/clipper.cpp b/engines/twp/clipper/clipper.cpp
index 62de522c35d..bdb0e9ddd73 100644
--- a/engines/twp/clipper/clipper.cpp
+++ b/engines/twp/clipper/clipper.cpp
@@ -2760,8 +2760,7 @@ void Clipper::DoMaxima(TEdge *e) {
 		DeleteFromAEL(e);
 		DeleteFromAEL(eMaxPair);
 	} else if (e->OutIdx >= 0 && eMaxPair->OutIdx >= 0) {
-		if (e->OutIdx >= 0)
-			AddLocalMaxPoly(e, eMaxPair, e->Top);
+		AddLocalMaxPoly(e, eMaxPair, e->Top);
 		DeleteFromAEL(e);
 		DeleteFromAEL(eMaxPair);
 	}


Commit: 9c5e5f2c83021b4fce036697141b56143fb5a33e
    https://github.com/scummvm/scummvm/commit/9c5e5f2c83021b4fce036697141b56143fb5a33e
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix the 'succeeded' variable was assigned the same value in clipper. PVS-Studio V1048

Changed paths:
    engines/twp/clipper/clipper.cpp


diff --git a/engines/twp/clipper/clipper.cpp b/engines/twp/clipper/clipper.cpp
index bdb0e9ddd73..46afe5f68d5 100644
--- a/engines/twp/clipper/clipper.cpp
+++ b/engines/twp/clipper/clipper.cpp
@@ -1452,7 +1452,6 @@ bool Clipper::ExecuteInternal() {
 		m_Maxima = MaximaList();
 		m_SortedEdges = 0;
 
-		succeeded = true;
 		cInt botY, topY;
 		if (!PopScanbeam(botY))
 			return false;


Commit: b765b43881c1d7fec5e56568b5c2c99630c19b76
    https://github.com/scummvm/scummvm/commit/b765b43881c1d7fec5e56568b5c2c99630c19b76
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix the 'j->OutPt1' variable was assigned the same value in clipper. PVS-Studio V1048

Changed paths:
    engines/twp/clipper/clipper.cpp


diff --git a/engines/twp/clipper/clipper.cpp b/engines/twp/clipper/clipper.cpp
index 46afe5f68d5..4ba0b0a2e29 100644
--- a/engines/twp/clipper/clipper.cpp
+++ b/engines/twp/clipper/clipper.cpp
@@ -3225,7 +3225,6 @@ bool Clipper::JoinPoints(Join *j, OutRec *outRec1, OutRec *outRec2) {
 			op2->Next = op1;
 			op1b->Next = op2b;
 			op2b->Prev = op1b;
-			j->OutPt1 = op1;
 			j->OutPt2 = op1b;
 			return true;
 		} else {
@@ -3235,7 +3234,6 @@ bool Clipper::JoinPoints(Join *j, OutRec *outRec1, OutRec *outRec2) {
 			op2->Prev = op1;
 			op1b->Prev = op2b;
 			op2b->Next = op1b;
-			j->OutPt1 = op1;
 			j->OutPt2 = op1b;
 			return true;
 		}
@@ -3329,7 +3327,6 @@ bool Clipper::JoinPoints(Join *j, OutRec *outRec1, OutRec *outRec2) {
 			op2->Next = op1;
 			op1b->Next = op2b;
 			op2b->Prev = op1b;
-			j->OutPt1 = op1;
 			j->OutPt2 = op1b;
 			return true;
 		} else {
@@ -3339,7 +3336,6 @@ bool Clipper::JoinPoints(Join *j, OutRec *outRec1, OutRec *outRec2) {
 			op2->Prev = op1;
 			op1b->Prev = op2b;
 			op2b->Next = op1b;
-			j->OutPt1 = op1;
 			j->OutPt2 = op1b;
 			return true;
 		}


Commit: f487c0216f0a44d68fd7fa626a27699b1e885410
    https://github.com/scummvm/scummvm/commit/f487c0216f0a44d68fd7fa626a27699b1e885410
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix An unconditional 'return' within a loop in squirrel. PVS-Studio V612

Changed paths:
    engines/twp/squirrel/sqarray.h
    engines/twp/squirrel/sqobject.cpp


diff --git a/engines/twp/squirrel/sqarray.h b/engines/twp/squirrel/sqarray.h
index 7c6c204945d..8664b6373f7 100755
--- a/engines/twp/squirrel/sqarray.h
+++ b/engines/twp/squirrel/sqarray.h
@@ -43,7 +43,7 @@ public:
     SQInteger Next(const SQObjectPtr &refpos,SQObjectPtr &outkey,SQObjectPtr &outval)
     {
         SQUnsignedInteger idx=TranslateIndex(refpos);
-        while(idx<_values.size()){
+        if(idx<_values.size()){
             //first found
             outkey=(SQInteger)idx;
             SQObjectPtr &o = _values[idx];
diff --git a/engines/twp/squirrel/sqobject.cpp b/engines/twp/squirrel/sqobject.cpp
index be376131252..736666251fa 100755
--- a/engines/twp/squirrel/sqobject.cpp
+++ b/engines/twp/squirrel/sqobject.cpp
@@ -60,7 +60,7 @@ void SQString::Release()
 SQInteger SQString::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval)
 {
     SQInteger idx = (SQInteger)TranslateIndex(refpos);
-    while(idx < _len){
+    if(idx < _len){
         outkey = (SQInteger)idx;
         outval = (SQInteger)((SQUnsignedInteger)_val[idx]);
         //return idx for the next iteration


Commit: 15df97fce9abf0b34badd7f3fd0ccf25e0a813c7
    https://github.com/scummvm/scummvm/commit/15df97fce9abf0b34badd7f3fd0ccf25e0a813c7
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix calling the 'Finalize' virtual function in the destructor in SQClass. PVS-Studio V1053

Changed paths:
    engines/twp/squirrel/sqclass.cpp
    engines/twp/squirrel/sqclass.h


diff --git a/engines/twp/squirrel/sqclass.cpp b/engines/twp/squirrel/sqclass.cpp
index fc619616c05..31ea068346b 100755
--- a/engines/twp/squirrel/sqclass.cpp
+++ b/engines/twp/squirrel/sqclass.cpp
@@ -34,7 +34,11 @@ SQClass::SQClass(SQSharedState *ss,SQClass *base)
 }
 
 void SQClass::Finalize() {
-    _attributes.Null();
+    FinalizeCore();
+}
+
+void SQClass::FinalizeCore() {
+	_attributes.Null();
     _NULL_SQOBJECT_VECTOR(_defaultvalues,_defaultvalues.size());
     _methods.resize(0);
     _NULL_SQOBJECT_VECTOR(_metamethods,MT_LAST);
diff --git a/engines/twp/squirrel/sqclass.h b/engines/twp/squirrel/sqclass.h
index 7d4021721bf..b1eef338513 100755
--- a/engines/twp/squirrel/sqclass.h
+++ b/engines/twp/squirrel/sqclass.h
@@ -65,6 +65,7 @@ public:
         sq_delete(this, SQClass);
     }
     void Finalize();
+    void FinalizeCore();
 #ifndef NO_GARBAGE_COLLECTOR
     void Mark(SQCollectable ** );
     SQObjectType GetType() {return OT_CLASS;}


Commit: 14301e272ec6129a15ef62134fdf68c90cca1867
    https://github.com/scummvm/scummvm/commit/14301e272ec6129a15ef62134fdf68c90cca1867
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix pointer to local variable 'funcstate' is stored outside the scope of this variable in squirrel. PVS-Studio V506

Changed paths:
    engines/twp/squirrel/sqcompiler.cpp


diff --git a/engines/twp/squirrel/sqcompiler.cpp b/engines/twp/squirrel/sqcompiler.cpp
index 9f357952ca7..60fa8a026bb 100755
--- a/engines/twp/squirrel/sqcompiler.cpp
+++ b/engines/twp/squirrel/sqcompiler.cpp
@@ -149,7 +149,7 @@ public:
     bool IsEndOfStatement() { return ((_lex._prevtoken == _SC('\n')) || (_token == SQUIRREL_EOB) || (_token == _SC('}')) || (_token == _SC(';'))); }
     void OptionalSemicolon()
     {
-        if(_token == _SC(';')) { Lex(); return; }        
+        if(_token == _SC(';')) { Lex(); return; }
     }
     void MoveIfCurrentTargetIsLocal() {
         SQInteger trg = _fs->TopTarget();
@@ -192,8 +192,10 @@ public:
                     _lex._currentline, _lex._currentcolumn);
             }
             _vm->_lasterror = SQString::Create(_ss(_vm), _compilererror, -1);
+			_fs = nullptr;
             return false;
         }
+		_fs = nullptr;
         return true;
     }
     void Statements()
@@ -1176,7 +1178,7 @@ public:
         }
         _fs->AddInstruction(_OP_JMP, 0, jmppos - _fs->GetCurrentPos() - 1, 0);
         if(jzpos>  0) _fs->SetInstructionParam(jzpos, 1, _fs->GetCurrentPos() - jzpos);
-        
+
         END_BREAKBLE_BLOCK(continuetrg);
 
 		END_SCOPE();


Commit: c613a94ddc5fff7bdaba9a474d6116160a18446d
    https://github.com/scummvm/scummvm/commit/c613a94ddc5fff7bdaba9a474d6116160a18446d
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix A part of conditional expression is always true or false in squirrel. PVS-Studio V560

Changed paths:
    engines/twp/squirrel/sqcompiler.cpp
    engines/twp/squirrel/sqstdrex.cpp


diff --git a/engines/twp/squirrel/sqcompiler.cpp b/engines/twp/squirrel/sqcompiler.cpp
index 60fa8a026bb..24a8e253737 100755
--- a/engines/twp/squirrel/sqcompiler.cpp
+++ b/engines/twp/squirrel/sqcompiler.cpp
@@ -391,7 +391,7 @@ public:
 
             switch(op){
             case TK_NEWSLOT:
-                if(ds == OBJECT || ds == BASE)
+                if(ds == OBJECT)
                     EmitDerefOp(_OP_NEWSLOT);
                 else //if _derefstate != DEREF_NO_DEREF && DEREF_FIELD so is the index of a local
                     Error(_SC("can't 'create' a local slot"));
diff --git a/engines/twp/squirrel/sqstdrex.cpp b/engines/twp/squirrel/sqstdrex.cpp
index 2112afec55b..8dcdcc5b9b0 100755
--- a/engines/twp/squirrel/sqstdrex.cpp
+++ b/engines/twp/squirrel/sqstdrex.cpp
@@ -413,7 +413,7 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar
                 //checks that 0 matches satisfy the expression(if so skips)
                 //if not would always stop(for instance if is a '?')
                 if(greedystop->type != OP_GREEDY ||
-                (greedystop->type == OP_GREEDY && ((greedystop->right >> 16)&0x0000FFFF) != 0))
+                (((greedystop->right >> 16)&0x0000FFFF) != 0))
                 {
                     SQRexNode *gnext = NULL;
                     if(greedystop->next != -1) {


Commit: 4c3e77e568cdd517c49b8f0414debcfc08e33440
    https://github.com/scummvm/scummvm/commit/4c3e77e568cdd517c49b8f0414debcfc08e33440
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix a variable is assigned to itself in squirrel. PVS-Studio V560

Changed paths:
    engines/twp/squirrel/sqfuncstate.cpp


diff --git a/engines/twp/squirrel/sqfuncstate.cpp b/engines/twp/squirrel/sqfuncstate.cpp
index 9d613545c25..779b40df420 100755
--- a/engines/twp/squirrel/sqfuncstate.cpp
+++ b/engines/twp/squirrel/sqfuncstate.cpp
@@ -481,7 +481,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
         break;
         case _OP_GET:
             if( pi.op == _OP_LOAD && pi._arg0 == i._arg2 && (!IsLocal(pi._arg0))){
-                pi._arg1 = pi._arg1;
                 pi._arg2 = (unsigned char)i._arg1;
                 pi.op = _OP_GETK;
                 pi._arg0 = i._arg0;
@@ -493,7 +492,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
             if( pi.op == _OP_LOAD  && pi._arg0 == i._arg1 && (!IsLocal(pi._arg0))){
                 pi.op = _OP_PREPCALLK;
                 pi._arg0 = i._arg0;
-                pi._arg1 = pi._arg1;
                 pi._arg2 = i._arg2;
                 pi._arg3 = i._arg3;
                 return;
@@ -511,7 +509,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
             if(aat != -1 && pi._arg0 == i._arg1 && (!IsLocal(pi._arg0))){
                 pi.op = _OP_APPENDARRAY;
                 pi._arg0 = i._arg0;
-                pi._arg1 = pi._arg1;
                 pi._arg2 = (unsigned char)aat;
                 pi._arg3 = MAX_FUNC_STACKSIZE;
                 return;
@@ -553,7 +550,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
             {
                 pi.op = i.op;
                 pi._arg0 = i._arg0;
-                pi._arg1 = pi._arg1;
                 pi._arg2 = i._arg2;
                 pi._arg3 = MAX_FUNC_STACKSIZE;
                 return;


Commit: 6d84bf32a72a89670c37f9e9928c3ea475362633
    https://github.com/scummvm/scummvm/commit/6d84bf32a72a89670c37f9e9928c3ea475362633
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix unreachable code detected in squirrel. PVS-Studio V779

Changed paths:
    engines/twp/squirrel/sqlexer.cpp
    engines/twp/squirrel/sqvm.cpp


diff --git a/engines/twp/squirrel/sqlexer.cpp b/engines/twp/squirrel/sqlexer.cpp
index 460e9efedcd..8a2bbf0a579 100755
--- a/engines/twp/squirrel/sqlexer.cpp
+++ b/engines/twp/squirrel/sqlexer.cpp
@@ -277,7 +277,6 @@ SQInteger SQLexer::Lex()
                     NEXT();
                     RETURN_TOKEN(c);
                 }
-                RETURN_TOKEN(0);
             }
         }
     }
diff --git a/engines/twp/squirrel/sqvm.cpp b/engines/twp/squirrel/sqvm.cpp
index 4e77a554e00..21d8c5ab652 100755
--- a/engines/twp/squirrel/sqvm.cpp
+++ b/engines/twp/squirrel/sqvm.cpp
@@ -241,10 +241,6 @@ bool SQVM::ObjCmp(const SQObjectPtr &o1,const SQObjectPtr &o2,SQInteger &result)
         default:
             _RET_SUCCEED( _userpointer(o1) < _userpointer(o2)?-1:1 );
         }
-        assert(0);
-        //if(type(res)!=OT_INTEGER) { Raise_CompareError(o1,o2); return false; }
-        //  _RET_SUCCEED(_integer(res));
-
     }
     else{
         if(sq_isnumeric(o1) && sq_isnumeric(o2)){
@@ -1103,7 +1099,6 @@ exception_trap:
         _lasterror = currerror;
         return false;
     }
-    assert(0);
 }
 
 bool SQVM::CreateClassInstance(SQClass *theclass, SQObjectPtr &inst, SQObjectPtr &constructor)


Commit: f461e4bdcaf0412b28dcc782557f49d12f91dae4
    https://github.com/scummvm/scummvm/commit/f461e4bdcaf0412b28dcc782557f49d12f91dae4
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix the 'ci' pointer was utilized before it was verified against nullptr in squirrel. PVS-Studio V595

Changed paths:
    engines/twp/squirrel/sqvm.cpp


diff --git a/engines/twp/squirrel/sqvm.cpp b/engines/twp/squirrel/sqvm.cpp
index 21d8c5ab652..1f73dfef0a6 100755
--- a/engines/twp/squirrel/sqvm.cpp
+++ b/engines/twp/squirrel/sqvm.cpp
@@ -1047,13 +1047,14 @@ exception_restore:
                 _GUARD(NewSlotA(STK(arg1),STK(arg2),STK(arg3),(arg0&NEW_SLOT_ATTRIBUTES_FLAG) ? STK(arg2-1) : SQObjectPtr(),(arg0&NEW_SLOT_STATIC_FLAG)?true:false,false));
                 continue;
             case _OP_GETBASE:{
-                SQClosure *clo = _closure(ci->_closure);
-                if(clo->_base) {
-                    TARGET = clo->_base;
-                }
-                else {
-                    TARGET.Null();
+                if (ci) {
+                    SQClosure *clo = _closure(ci->_closure);
+                    if (clo && clo->_base) {
+                        TARGET = clo->_base;
+                        continue;
+                    }
                 }
+                TARGET.Null();
                 continue;
             }
             case _OP_CLOSE:
@@ -1091,7 +1092,7 @@ exception_trap:
                     }
             }
             if(ci->_generator) ci->_generator->Kill();
-            bool mustbreak = ci && ci->_root;
+            bool mustbreak = ci->_root;
             LeaveFrame();
             if(mustbreak) break;
         }


Commit: 3f80e4a24becdccfe8006b673fd56ab0165ad8c3
    https://github.com/scummvm/scummvm/commit/3f80e4a24becdccfe8006b673fd56ab0165ad8c3
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix calling the 'Finalize' virtual function in the destructor in SQVM. PVS-Studio V1053

Changed paths:
    engines/twp/squirrel/sqvm.cpp
    engines/twp/squirrel/sqvm.h


diff --git a/engines/twp/squirrel/sqvm.cpp b/engines/twp/squirrel/sqvm.cpp
index 1f73dfef0a6..f64bc675086 100755
--- a/engines/twp/squirrel/sqvm.cpp
+++ b/engines/twp/squirrel/sqvm.cpp
@@ -131,6 +131,11 @@ SQVM::SQVM(SQSharedState *ss)
 }
 
 void SQVM::Finalize()
+{
+	FinalizeCore();
+}
+
+void SQVM::FinalizeCore()
 {
     if(_releasehook) { _releasehook(_foreignptr,0); _releasehook = NULL; }
     if(_openouters) CloseOuters(&_stack._vals[0]);
diff --git a/engines/twp/squirrel/sqvm.h b/engines/twp/squirrel/sqvm.h
index 41d556a3832..e86a4f82476 100755
--- a/engines/twp/squirrel/sqvm.h
+++ b/engines/twp/squirrel/sqvm.h
@@ -118,6 +118,7 @@ public:
     SQObjectType GetType() {return OT_THREAD;}
 #endif
     void Finalize();
+    void FinalizeCore();
     void GrowCallStack() {
         SQInteger newsize = _alloccallsstacksize*2;
         _callstackdata.resize(newsize);


Commit: 2e823bc6f63320b5c15822b8dd1b9e530920b35f
    https://github.com/scummvm/scummvm/commit/2e823bc6f63320b5c15822b8dd1b9e530920b35f
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix excessive checks can be simplified in squirrel. PVS-Studio V728

Changed paths:
    engines/twp/squirrel/sqcompiler.cpp


diff --git a/engines/twp/squirrel/sqcompiler.cpp b/engines/twp/squirrel/sqcompiler.cpp
index 24a8e253737..e3e673df2a0 100755
--- a/engines/twp/squirrel/sqcompiler.cpp
+++ b/engines/twp/squirrel/sqcompiler.cpp
@@ -916,7 +916,7 @@ public:
             }
         break;
         }
-        return (!_es.donot_get || ( _es.donot_get && (_token == _SC('.') || _token == _SC('['))));
+        return (!_es.donot_get || ((_token == _SC('.') || _token == _SC('['))));
     }
     void FunctionCallArgs(bool rawcall = false)
     {
@@ -991,7 +991,7 @@ public:
             SQInteger key = _fs->PopTarget();
             SQInteger attrs = hasattrs ? _fs->PopTarget():-1;
             ((void)attrs);
-            assert((hasattrs && (attrs == key-1)) || !hasattrs);
+            assert(!hasattrs || (attrs == key-1));
             unsigned char flags = (hasattrs?NEW_SLOT_ATTRIBUTES_FLAG:0)|(isstatic?NEW_SLOT_STATIC_FLAG:0);
             SQInteger table = _fs->TopTarget(); //<<BECAUSE OF THIS NO COMMON EMIT FUNC IS POSSIBLE
             if(separator == _SC(',')) { //hack recognizes a table from the separator


Commit: df0d1cb8d4dae88610a569751735ae1456686438
    https://github.com/scummvm/scummvm/commit/df0d1cb8d4dae88610a569751735ae1456686438
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix not all members of a class are initialized in squirrel. PVS-Studio V730

Changed paths:
    engines/twp/squirrel/sqfuncproto.h
    engines/twp/squirrel/sqopcodes.h
    engines/twp/squirrel/sqstate.cpp
    engines/twp/squirrel/sqstring.h
    engines/twp/squirrel/sqvm.h


diff --git a/engines/twp/squirrel/sqfuncproto.h b/engines/twp/squirrel/sqfuncproto.h
index d5883454469..052a365c95c 100755
--- a/engines/twp/squirrel/sqfuncproto.h
+++ b/engines/twp/squirrel/sqfuncproto.h
@@ -12,7 +12,7 @@ enum SQOuterType {
 struct SQOuterVar
 {
 
-    SQOuterVar(){}
+    SQOuterVar() : _type(otLOCAL) {}
     SQOuterVar(const SQObjectPtr &name,const SQObjectPtr &src,SQOuterType t)
     {
         _name = name;
diff --git a/engines/twp/squirrel/sqopcodes.h b/engines/twp/squirrel/sqopcodes.h
index 15d80e4bb05..30b5708ed67 100755
--- a/engines/twp/squirrel/sqopcodes.h
+++ b/engines/twp/squirrel/sqopcodes.h
@@ -108,7 +108,7 @@ struct SQInstructionDesc {
 
 struct SQInstruction
 {
-    SQInstruction(){};
+    SQInstruction() : _arg1(0), op(0), _arg0(0), _arg2(0), _arg3(0){}
     SQInstruction(SQOpcode _op,SQInteger a0=0,SQInteger a1=0,SQInteger a2=0,SQInteger a3=0)
     {   op = (unsigned char)_op;
         _arg0 = (unsigned char)a0;_arg1 = (SQInt32)a1;
diff --git a/engines/twp/squirrel/sqstate.cpp b/engines/twp/squirrel/sqstate.cpp
index c89bdc4a254..4162e0d6a1c 100755
--- a/engines/twp/squirrel/sqstate.cpp
+++ b/engines/twp/squirrel/sqstate.cpp
@@ -14,6 +14,13 @@
 
 SQSharedState::SQSharedState()
 {
+	_metamethods = NULL;
+	_systemstrings = NULL;
+	_types = NULL;
+	_stringtable = NULL;
+	_gc_chain = NULL;
+	_scratchpad = NULL;
+	_scratchpadsize = 0;
     _compilererrorhandler = NULL;
     _printfunc = NULL;
     _errorfunc = NULL;
diff --git a/engines/twp/squirrel/sqstring.h b/engines/twp/squirrel/sqstring.h
index 82f1cdf46e3..c3a1a818332 100755
--- a/engines/twp/squirrel/sqstring.h
+++ b/engines/twp/squirrel/sqstring.h
@@ -13,7 +13,10 @@ inline SQHash _hashstr (const SQChar *s, size_t l)
 
 struct SQString : public SQRefCounted
 {
-    SQString(){}
+    SQString() : _sharedstate(nullptr), _next(nullptr), _len(0), _hash(0)
+	{
+		_val[0] = 0;
+	}
     ~SQString(){}
 public:
     static SQString *Create(SQSharedState *ss, const SQChar *, SQInteger len = -1 );
diff --git a/engines/twp/squirrel/sqvm.h b/engines/twp/squirrel/sqvm.h
index e86a4f82476..f4f0e5500cc 100755
--- a/engines/twp/squirrel/sqvm.h
+++ b/engines/twp/squirrel/sqvm.h
@@ -18,7 +18,7 @@
 void sq_base_register(HSQUIRRELVM v);
 
 struct SQExceptionTrap{
-    SQExceptionTrap() {}
+    SQExceptionTrap() : _stackbase(0), _stacksize(0), _ip(nullptr), _extarget(0) {}
     SQExceptionTrap(SQInteger ss, SQInteger stackbase,SQInstruction *ip, SQInteger ex_target){ _stacksize = ss; _stackbase = stackbase; _ip = ip; _extarget = ex_target;}
     SQInteger _stackbase;
     SQInteger _stacksize;


Commit: d4b3907d84e5dbcd412a409ae6c276ee442adb6e
    https://github.com/scummvm/scummvm/commit/d4b3907d84e5dbcd412a409ae6c276ee442adb6e
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix variables were assigned the same value. in squirrel. PVS-Studio V1048

Changed paths:
    engines/twp/squirrel/sqfuncstate.cpp
    engines/twp/squirrel/sqvm.cpp


diff --git a/engines/twp/squirrel/sqfuncstate.cpp b/engines/twp/squirrel/sqfuncstate.cpp
index 779b40df420..797f2f77350 100755
--- a/engines/twp/squirrel/sqfuncstate.cpp
+++ b/engines/twp/squirrel/sqfuncstate.cpp
@@ -559,7 +559,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
             if((pi.op == _OP_LOADNULLS && pi._arg0+pi._arg1 == i._arg0)) {
 
                 pi._arg1 = pi._arg1 + 1;
-                pi.op = _OP_LOADNULLS;
                 return;
             }
             break;
diff --git a/engines/twp/squirrel/sqvm.cpp b/engines/twp/squirrel/sqvm.cpp
index f64bc675086..2cb14212847 100755
--- a/engines/twp/squirrel/sqvm.cpp
+++ b/engines/twp/squirrel/sqvm.cpp
@@ -1490,9 +1490,6 @@ bool SQVM::NewSlot(const SQObjectPtr &self,const SQObjectPtr &key,const SQObject
                     }
                     rawcall = false;
                 }
-                else {
-                    rawcall = true;
-                }
             }
         }
         if(rawcall) _table(self)->NewSlot(key,val); //cannot fail


Commit: aeee6ccc179dc4e036cc03d776fb6cdceea28eb1
    https://github.com/scummvm/scummvm/commit/aeee6ccc179dc4e036cc03d776fb6cdceea28eb1
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix array underrun is possible. The value of 'fpos' index could reach -1 in squirrel. PVS-Studio V557

Changed paths:
    engines/twp/squirrel/sqstdstring.cpp


diff --git a/engines/twp/squirrel/sqstdstring.cpp b/engines/twp/squirrel/sqstdstring.cpp
index ab1a801127c..7b7bd4c0d45 100755
--- a/engines/twp/squirrel/sqstdstring.cpp
+++ b/engines/twp/squirrel/sqstdstring.cpp
@@ -112,6 +112,7 @@ SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen
                 {
                 size_t flen = scstrlen(fmt);
                 SQInteger fpos = flen - 1;
+				assert(fpos >= 0);
                 SQChar f = fmt[fpos];
                 const SQChar *prec = (const SQChar *)_PRINT_INT_PREC;
                 while(*prec != _SC('\0')) {


Commit: 827b7ae5a87d5d15e4dc39928c95c3c72be3c008
    https://github.com/scummvm/scummvm/commit/827b7ae5a87d5d15e4dc39928c95c3c72be3c008
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix 'sqvector' lacks the copy assignment operator in squirrel. PVS-Studio V690

Changed paths:
    engines/twp/squirrel/squtils.h


diff --git a/engines/twp/squirrel/squtils.h b/engines/twp/squirrel/squtils.h
index f3e819a58ef..7141b237cfa 100755
--- a/engines/twp/squirrel/squtils.h
+++ b/engines/twp/squirrel/squtils.h
@@ -28,6 +28,11 @@ public:
     {
         copy(v);
     }
+	inline sqvector<T>& operator=(const sqvector<T>& v)
+	{
+		copy(v);
+		return *this;
+	}
     void copy(const sqvector<T>& v)
     {
         if(_size) {


Commit: 2cc56150420e51a476f24ef32b21e4e2ebc37340
    https://github.com/scummvm/scummvm/commit/2cc56150420e51a476f24ef32b21e4e2ebc37340
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix 'sqvector' constructor contains potentially uninitialized members in squirrel. PVS-Studio V1077

Changed paths:
    engines/twp/squirrel/squtils.h


diff --git a/engines/twp/squirrel/squtils.h b/engines/twp/squirrel/squtils.h
index 7141b237cfa..4cb2d4ed7b0 100755
--- a/engines/twp/squirrel/squtils.h
+++ b/engines/twp/squirrel/squtils.h
@@ -26,6 +26,9 @@ public:
     }
     sqvector(const sqvector<T>& v)
     {
+		_vals = NULL;
+        _size = 0;
+        _allocated = 0;
         copy(v);
     }
 	inline sqvector<T>& operator=(const sqvector<T>& v)


Commit: cdc8d16fd55d7cdb84ce228048487daaf91837ed
    https://github.com/scummvm/scummvm/commit/cdc8d16fd55d7cdb84ce228048487daaf91837ed
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00

Commit Message:
TWP: Fix '_sharedstate' overwrites field in base class in squirrel. PVS-Studio V703

Changed paths:
    engines/twp/squirrel/sqvm.h


diff --git a/engines/twp/squirrel/sqvm.h b/engines/twp/squirrel/sqvm.h
index f4f0e5500cc..7bf80ab9ea3 100755
--- a/engines/twp/squirrel/sqvm.h
+++ b/engines/twp/squirrel/sqvm.h
@@ -169,7 +169,6 @@ public:
     CallInfo *ci;
     SQUserPointer _foreignptr;
     //VMs sharing the same state
-    SQSharedState *_sharedstate;
     SQInteger _nnativecalls;
     SQInteger _nmetamethodscall;
     SQRELEASEHOOK _releasehook;




More information about the Scummvm-git-logs mailing list