[Scummvm-git-logs] scummvm master -> 37db3eff264c456e18405c1a46096769b5c612da

mduggan mgithub at guarana.org
Thu Apr 30 07:16:48 UTC 2020


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

Summary:
37db3eff26 ULTIMA8: Fix lots more coverity issues


Commit: 37db3eff264c456e18405c1a46096769b5c612da
    https://github.com/scummvm/scummvm/commit/37db3eff264c456e18405c1a46096769b5c612da
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-30T16:16:36+09:00

Commit Message:
ULTIMA8: Fix lots more coverity issues

Changed paths:
    engines/ultima/ultima8/audio/audio_channel.cpp
    engines/ultima/ultima8/games/game_data.cpp
    engines/ultima/ultima8/games/u8_game.cpp
    engines/ultima/ultima8/graphics/frame_id.h
    engines/ultima/ultima8/graphics/inverter_process.cpp
    engines/ultima/ultima8/graphics/texture.cpp
    engines/ultima/ultima8/gumps/container_gump.cpp
    engines/ultima/ultima8/gumps/credits_gump.cpp
    engines/ultima/ultima8/gumps/game_map_gump.cpp
    engines/ultima/ultima8/gumps/message_box_gump.cpp
    engines/ultima/ultima8/gumps/quit_gump.cpp
    engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
    engines/ultima/ultima8/gumps/widgets/button_widget.cpp
    engines/ultima/ultima8/usecode/uc_machine.cpp
    engines/ultima/ultima8/world/actors/actor.cpp
    engines/ultima/ultima8/world/actors/animation_tracker.cpp
    engines/ultima/ultima8/world/actors/combat_process.cpp
    engines/ultima/ultima8/world/actors/pathfinder.cpp
    engines/ultima/ultima8/world/actors/pathfinder.h
    engines/ultima/ultima8/world/actors/pathfinder_process.cpp
    engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp
    engines/ultima/ultima8/world/actors/weapon_overlay.h
    engines/ultima/ultima8/world/camera_process.cpp
    engines/ultima/ultima8/world/create_item_process.cpp
    engines/ultima/ultima8/world/gravity_process.cpp
    engines/ultima/ultima8/world/item.cpp
    engines/ultima/ultima8/world/item_sorter.cpp
    engines/ultima/ultima8/world/missile_tracker.cpp
    engines/ultima/ultima8/world/sprite_process.cpp


diff --git a/engines/ultima/ultima8/audio/audio_channel.cpp b/engines/ultima/ultima8/audio/audio_channel.cpp
index c997fd16b2..9e8383a3a0 100644
--- a/engines/ultima/ultima8/audio/audio_channel.cpp
+++ b/engines/ultima/ultima8/audio/audio_channel.cpp
@@ -33,7 +33,7 @@ namespace Ultima8 {
 
 AudioChannel::AudioChannel(Audio::Mixer *mixer, uint32 sampleRate, bool stereo) :
 		_mixer(mixer), _decompressorSize(0), _frameSize(0), _loop(0), _sample(nullptr),
-		_frameEvenOdd(0), _paused(false), _priority(0) {
+		_frameEvenOdd(0), _paused(false), _priority(0), _lVol(0), _rVol(0), _pitchShift(0) {
 }
 
 AudioChannel::~AudioChannel(void) {
diff --git a/engines/ultima/ultima8/games/game_data.cpp b/engines/ultima/ultima8/games/game_data.cpp
index b16aaad126..fe942de632 100644
--- a/engines/ultima/ultima8/games/game_data.cpp
+++ b/engines/ultima/ultima8/games/game_data.cpp
@@ -457,7 +457,7 @@ SpeechFlex *GameData::getSpeechFlex(uint32 shapeNum) {
 	char langletter = _gameInfo->getLanguageFileLetter();
 	if (!langletter) {
 		perr << "GameData::getSpeechFlex: Unknown language." << Std::endl;
-		// FIXME: This leaks s
+		delete s;
 		return nullptr;
 	}
 
diff --git a/engines/ultima/ultima8/games/u8_game.cpp b/engines/ultima/ultima8/games/u8_game.cpp
index cee3db478b..27b2d76c63 100644
--- a/engines/ultima/ultima8/games/u8_game.cpp
+++ b/engines/ultima/ultima8/games/u8_game.cpp
@@ -125,6 +125,7 @@ bool U8Game::startGame() {
 	Common::SeekableReadStream *npcd = u8save->getDataSource("NPCDATA.DAT");
 	if (!npcd) {
 		perr << "Unable to load savegame/u8save.000/NPCDATA.DAT." << Std::endl;
+		delete icd;
 		return false;
 	}
 
diff --git a/engines/ultima/ultima8/graphics/frame_id.h b/engines/ultima/ultima8/graphics/frame_id.h
index 7f83737c0e..fa6512de0b 100644
--- a/engines/ultima/ultima8/graphics/frame_id.h
+++ b/engines/ultima/ultima8/graphics/frame_id.h
@@ -33,7 +33,7 @@ struct FrameID {
 	uint32 _shapeNum;
 	uint32 _frameNum;
 
-	FrameID() { }
+	FrameID() : _flexId(0), _shapeNum(0), _frameNum(0) { }
 	FrameID(uint16 flex, uint32 shape, uint32 frame)
 		: _flexId(flex), _shapeNum(shape), _frameNum(frame) {
 	}
diff --git a/engines/ultima/ultima8/graphics/inverter_process.cpp b/engines/ultima/ultima8/graphics/inverter_process.cpp
index c44ac53b17..c8eacbf6a7 100644
--- a/engines/ultima/ultima8/graphics/inverter_process.cpp
+++ b/engines/ultima/ultima8/graphics/inverter_process.cpp
@@ -48,7 +48,7 @@ InverterProcess *InverterProcess::_inverter = nullptr;
 DEFINE_RUNTIME_CLASSTYPE_CODE(InverterProcess, Process)
 
 InverterProcess::InverterProcess()
-	: Process() {
+	: Process(), _targetState(0) {
 
 }
 
diff --git a/engines/ultima/ultima8/graphics/texture.cpp b/engines/ultima/ultima8/graphics/texture.cpp
index a0ebfff456..0c99aec0aa 100644
--- a/engines/ultima/ultima8/graphics/texture.cpp
+++ b/engines/ultima/ultima8/graphics/texture.cpp
@@ -31,7 +31,8 @@ namespace Ultima {
 namespace Ultima8 {
 
 
-Texture::Texture() : _format(TEX_FMT_STANDARD), _glTex(0), _next(nullptr) {
+Texture::Texture() : _format(TEX_FMT_STANDARD), _glTex(0),
+	_next(nullptr), _wlog2(-1), _hlog2(-1) {
 }
 
 //
diff --git a/engines/ultima/ultima8/gumps/container_gump.cpp b/engines/ultima/ultima8/gumps/container_gump.cpp
index 4f5e1d6ff5..87cc3c6962 100644
--- a/engines/ultima/ultima8/gumps/container_gump.cpp
+++ b/engines/ultima/ultima8/gumps/container_gump.cpp
@@ -47,14 +47,16 @@ namespace Ultima8 {
 DEFINE_RUNTIME_CLASSTYPE_CODE(ContainerGump, ItemRelativeGump)
 
 ContainerGump::ContainerGump()
-	: ItemRelativeGump(), _displayDragging(false) {
+	: ItemRelativeGump(), _displayDragging(false), _draggingShape(0),
+	  _draggingFrame(0), _draggingFlags(0), _draggingX(0), _draggingY(0) {
 
 }
 
 ContainerGump::ContainerGump(Shape *shape, uint32 frameNum, uint16 owner,
                              uint32 flags, int32 layer)
 	: ItemRelativeGump(0, 0, 5, 5, owner, flags, layer),
-	  _displayDragging(false) {
+	  _displayDragging(false), _draggingShape(0), _draggingFrame(0),
+	  _draggingFlags(0), _draggingX(0), _draggingY(0) {
 	_shape = shape;
 	_frameNum = frameNum;
 }
@@ -192,6 +194,7 @@ uint16 ContainerGump::TraceObjId(int32 mx, int32 my) {
 bool ContainerGump::GetLocationOfItem(uint16 itemid, int32 &gx, int32 &gy,
                                       int32 lerp_factor) {
 	Item *item = getItem(itemid);
+	if (!item) return false;
 	Item *parent_ = item->getParentAsContainer();
 	if (!parent_) return false;
 	if (parent_->getObjId() != _owner) return false;
diff --git a/engines/ultima/ultima8/gumps/credits_gump.cpp b/engines/ultima/ultima8/gumps/credits_gump.cpp
index 52bb81b06e..6f3d460cfb 100644
--- a/engines/ultima/ultima8/gumps/credits_gump.cpp
+++ b/engines/ultima/ultima8/gumps/credits_gump.cpp
@@ -38,15 +38,24 @@ namespace Ultima8 {
 DEFINE_RUNTIME_CLASSTYPE_CODE(CreditsGump, ModalGump)
 
 CreditsGump::CreditsGump()
-	: ModalGump() {
-
+	: ModalGump(), _parSkip(0), _timer(0), _title(nullptr),
+	  _nextTitle(nullptr), _state(CS_PLAYING),
+	  _nextTitleSurf(0), _currentSurface(0), _currentY(0) {
+	for (int i = 0; i < 4; i++) {
+	  _scroll[i] = nullptr;
+	  _scrollHeight[i] = 0;
+	}
 }
 
 CreditsGump::CreditsGump(const Std::string &text, int parskip,
                          uint32 flags, int32 layer)
-	: ModalGump(0, 0, 320, 200, 0, flags, layer), _text(text), _parSkip(parskip),
-	_timer(0), _title(nullptr), _nextTitle(nullptr), _state(CS_PLAYING),
-	_nextTitleSurf(0), _currentSurface(0), _currentY(0) {
+		: ModalGump(0, 0, 320, 200, 0, flags, layer), _text(text), _parSkip(parskip),
+		_timer(0), _title(nullptr), _nextTitle(nullptr), _state(CS_PLAYING),
+		_nextTitleSurf(0), _currentSurface(0), _currentY(0) {
+	for (int i = 0; i < 4; i++) {
+		_scroll[i] = nullptr;
+		_scrollHeight[i] = 0;
+	}
 }
 
 CreditsGump::~CreditsGump() {
diff --git a/engines/ultima/ultima8/gumps/game_map_gump.cpp b/engines/ultima/ultima8/gumps/game_map_gump.cpp
index 1cdcc9a5bc..d7d44a8cc8 100644
--- a/engines/ultima/ultima8/gumps/game_map_gump.cpp
+++ b/engines/ultima/ultima8/gumps/game_map_gump.cpp
@@ -59,7 +59,8 @@ DEFINE_RUNTIME_CLASSTYPE_CODE(GameMapGump, Gump)
 bool GameMapGump::_highlightItems = false;
 
 GameMapGump::GameMapGump() :
-	Gump(), _displayDragging(false) {
+	Gump(), _displayDragging(false), _displayList(0), _draggingShape(0),
+		_draggingFrame(0), _draggingFlags(0) {
 	_displayList = new ItemSorter();
 }
 
diff --git a/engines/ultima/ultima8/gumps/message_box_gump.cpp b/engines/ultima/ultima8/gumps/message_box_gump.cpp
index eaa0393186..fbe1cde203 100644
--- a/engines/ultima/ultima8/gumps/message_box_gump.cpp
+++ b/engines/ultima/ultima8/gumps/message_box_gump.cpp
@@ -46,7 +46,7 @@ namespace Ultima8 {
 DEFINE_RUNTIME_CLASSTYPE_CODE(MessageBoxGump, ModalGump)
 
 MessageBoxGump::MessageBoxGump()
-	: ModalGump() {
+	: ModalGump(), _titleColour(0) {
 
 }
 
diff --git a/engines/ultima/ultima8/gumps/quit_gump.cpp b/engines/ultima/ultima8/gumps/quit_gump.cpp
index 0a5549d964..233a96e0fb 100644
--- a/engines/ultima/ultima8/gumps/quit_gump.cpp
+++ b/engines/ultima/ultima8/gumps/quit_gump.cpp
@@ -36,7 +36,7 @@ namespace Ultima8 {
 
 DEFINE_RUNTIME_CLASSTYPE_CODE(QuitGump, ModalGump)
 
-QuitGump::QuitGump(): ModalGump(0, 0, 5, 5) {
+QuitGump::QuitGump(): ModalGump(0, 0, 5, 5), _yesWidget(0), _noWidget(0) {
 	Mouse *mouse = Mouse::get_instance();
 	mouse->pushMouseCursor();
 	mouse->setMouseCursor(Mouse::MOUSE_HAND);
diff --git a/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp b/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
index 83a3da2474..51c1f71e0e 100644
--- a/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
+++ b/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
@@ -52,17 +52,17 @@ namespace Ultima8 {
 DEFINE_RUNTIME_CLASSTYPE_CODE(ShapeViewerGump, ModalGump)
 
 ShapeViewerGump::ShapeViewerGump()
-	: ModalGump(), _curFlex(0), _flex(nullptr), _curShape(0),
-	_curFrame(0), _background(0), _shapeW(0), _shapeH(0), _shapeX(0), _shapeY(0) {
+	: ModalGump(), _curFlex(0), _flex(nullptr), _curShape(0), _curFrame(0),
+	  _background(0), _fontNo(0), _shapeW(0), _shapeH(0), _shapeX(0), _shapeY(0) {
 
 }
 
 ShapeViewerGump::ShapeViewerGump(int x, int y, int width, int height,
                                  Std::vector<Std::pair<Std::string, ShapeArchive *> > &flexes,
                                  uint32 flags, int32 layer)
-		: ModalGump(x, y, width, height, 0, flags, layer),
-		_flexes(flexes), _curFlex(0), _curShape(0), _curFrame(0),
-		_background(0), _fontNo(0), _shapeW(0), _shapeH(0), _shapeX(0), _shapeY(0) {
+		: ModalGump(x, y, width, height, 0, flags, layer), _flexes(flexes),
+		_curFlex(0), _curShape(0), _curFrame(0), _background(0), _fontNo(0),
+		_shapeW(0), _shapeH(0), _shapeX(0), _shapeY(0) {
 	if (_flexes.size())
 		_flex = _flexes[0].second;
 	else
diff --git a/engines/ultima/ultima8/gumps/widgets/button_widget.cpp b/engines/ultima/ultima8/gumps/widgets/button_widget.cpp
index 18da138879..4e43c1572a 100644
--- a/engines/ultima/ultima8/gumps/widgets/button_widget.cpp
+++ b/engines/ultima/ultima8/gumps/widgets/button_widget.cpp
@@ -54,7 +54,8 @@ ButtonWidget::ButtonWidget(int x, int y, Std::string txt, bool gamefont,
 
 ButtonWidget::ButtonWidget(int x, int y, FrameID frame_up, FrameID frame_down,
                            bool mouseOver, int32 layer)
-	: Gump(x, y, 5, 5, 0, 0, layer), _textWidget(0), _mouseOver(mouseOver) {
+	: Gump(x, y, 5, 5, 0, 0, layer), _textWidget(0), _mouseOver(mouseOver),
+		_origW(0), _origH(0), _mouseOverBlendCol(0) {
 	_shapeUp = GameData::get_instance()->getShape(frame_up);
 	_shapeDown = GameData::get_instance()->getShape(frame_down);
 	_frameNumUp = frame_up._frameNum;
diff --git a/engines/ultima/ultima8/usecode/uc_machine.cpp b/engines/ultima/ultima8/usecode/uc_machine.cpp
index fb5a9e28d4..0fda9da3f5 100644
--- a/engines/ultima/ultima8/usecode/uc_machine.cpp
+++ b/engines/ultima/ultima8/usecode/uc_machine.cpp
@@ -896,7 +896,7 @@ void UCMachine::execProcess(UCProcess *p) {
 			break;
 
 
-		case 0x38:
+		case 0x38: {
 			// 38 xx yy
 			// is element (size xx) in list? (or slist if yy is true)
 			// free list/slist afterwards
@@ -904,19 +904,23 @@ void UCMachine::execProcess(UCProcess *p) {
 			ui16a = cs.readByte();
 			ui32a = cs.readByte();
 			ui16b = p->_stack.pop2();
-			if (ui32a) { // stringlist
+			UCList *l = getList(ui16b);
+			if (!l) {
+				perr << "Invalid list id " << ui16b << Std::endl;
+				error = true;
+			} else if (ui32a) { // stringlist
 				if (ui16a != 2) {
 					perr << "Unhandled operand " << ui16a << " to in slist"
 					     << Std::endl;
 					error = true;
 				}
-				if (getList(ui16b)->stringInList(p->_stack.pop2()))
+				if (l->stringInList(p->_stack.pop2()))
 					p->_stack.push2(1);
 				else
 					p->_stack.push2(0);
 				freeStringList(ui16b);
 			} else {
-				bool found = getList(ui16b)->inList(p->_stack.access());
+				bool found = l->inList(p->_stack.access());
 				p->_stack.addSP(ui16a);
 				if (found)
 					p->_stack.push2(1);
@@ -927,7 +931,7 @@ void UCMachine::execProcess(UCProcess *p) {
 			}
 			LOGPF(("in list\t\t%s slist==%02X\n", print_bp(ui16a), ui32a));
 			break;
-
+		}
 		case 0x39:
 			// 39
 			// 16 bit bitwise and
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 44f8bab067..0a538a0914 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -995,7 +995,8 @@ void Actor::clearInCombat() {
 	if ((_actorFlags & ACT_INCOMBAT) == 0) return;
 
 	CombatProcess *cp = getCombatProcess();
-	cp->terminate();
+	if (cp)
+		cp->terminate();
 
 	clearActorFlag(ACT_INCOMBAT);
 }
diff --git a/engines/ultima/ultima8/world/actors/animation_tracker.cpp b/engines/ultima/ultima8/world/actors/animation_tracker.cpp
index 79554adf63..5dac4c0656 100644
--- a/engines/ultima/ultima8/world/actors/animation_tracker.cpp
+++ b/engines/ultima/ultima8/world/actors/animation_tracker.cpp
@@ -44,7 +44,12 @@ namespace Ultima8 {
 static const int watchactor = WATCHACTOR;
 #endif
 
-AnimationTracker::AnimationTracker() {
+AnimationTracker::AnimationTracker() : _firstFrame(true), _done(false),
+	_blocked(false), _unsupported(false), _hitObject(0), _mode(NormalMode),
+	_actor(0), _dir(0), _animAction(nullptr), _x(0), _y(0), _z(0),
+	_prevX(0), _prevY(0), _prevZ(0), _startX(0), _startY(0), _startZ(0),
+	_targetDx(0), _targetDy(0), _targetDz(0), _targetOffGroundLeft(0),
+	_firstStep(false), _shapeFrame(0), _currentFrame(0) {
 }
 
 AnimationTracker::~AnimationTracker() {
diff --git a/engines/ultima/ultima8/world/actors/combat_process.cpp b/engines/ultima/ultima8/world/actors/combat_process.cpp
index 8537b31c15..9bbfef0b61 100644
--- a/engines/ultima/ultima8/world/actors/combat_process.cpp
+++ b/engines/ultima/ultima8/world/actors/combat_process.cpp
@@ -44,18 +44,15 @@ namespace Ultima8 {
 // p_dynamic_cast stuff
 DEFINE_RUNTIME_CLASSTYPE_CODE(CombatProcess, Process)
 
-CombatProcess::CombatProcess() : Process() {
+CombatProcess::CombatProcess() : Process(), _target(0), _fixedTarget(0), _combatMode(CM_WAITING) {
 
 }
 
-CombatProcess::CombatProcess(Actor *actor_) {
+CombatProcess::CombatProcess(Actor *actor_) : _target(0), _fixedTarget(0), _combatMode(CM_WAITING) {
 	assert(actor_);
 	_itemNum = actor_->getObjId();
 
 	_type = 0x00F2; // CONSTANT !
-	_target = 0;
-	_fixedTarget = 0;
-	_combatMode = CM_WAITING;
 }
 
 void CombatProcess::terminate() {
@@ -239,9 +236,9 @@ ObjId CombatProcess::seekTarget() {
 
 int CombatProcess::getTargetDirection() {
 	Actor *a = getActor(_itemNum);
-	if (!a)
-		return 0; // shouldn't happen
 	Actor *t = getActor(_target);
+	if (!a || !t)
+		return 0; // shouldn't happen
 
 	return a->getDirToItemCentre(*t);
 }
diff --git a/engines/ultima/ultima8/world/actors/pathfinder.cpp b/engines/ultima/ultima8/world/actors/pathfinder.cpp
index f5031773f5..edfae3b357 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder.cpp
+++ b/engines/ultima/ultima8/world/actors/pathfinder.cpp
@@ -113,7 +113,9 @@ bool PathNodeCmp::operator()(const PathNode *n1, const PathNode *n2) const {
 	return (n1->heuristicTotalCost < n2->heuristicTotalCost);
 }
 
-Pathfinder::Pathfinder() {
+Pathfinder::Pathfinder() : _actor(nullptr), _targetItem(nullptr),
+		_hitMode(false), _expandTime(0), _targetX(0), _targetY(0),
+		_targetZ(0), _actorXd(0), _actorYd(0), _actorZd(0) {
 	expandednodes = 0;
 }
 
diff --git a/engines/ultima/ultima8/world/actors/pathfinder.h b/engines/ultima/ultima8/world/actors/pathfinder.h
index bc618fd5d4..670a896476 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder.h
+++ b/engines/ultima/ultima8/world/actors/pathfinder.h
@@ -34,6 +34,9 @@ class Actor;
 class Item;
 
 struct PathfindingState {
+	PathfindingState() : _x(0), _y(0), _z(0),  _direction(0),
+		_lastAnim(Animation::walk), _flipped(false),
+		_firstStep(true), _combat(false) {};
 	int32 _x, _y, _z;
 	Animation::Sequence _lastAnim;
 	uint32 _direction;
diff --git a/engines/ultima/ultima8/world/actors/pathfinder_process.cpp b/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
index f84691b72f..6e98757efd 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
+++ b/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
@@ -42,7 +42,8 @@ PathfinderProcess::PathfinderProcess() : Process(),
 }
 
 PathfinderProcess::PathfinderProcess(Actor *actor, ObjId item_, bool hit) :
-		_currentStep(0), _targetItem(item_), _hitMode(hit) {
+		_currentStep(0), _targetItem(item_), _hitMode(hit),
+		_targetX(0), _targetY(0), _targetZ(0) {
 	assert(actor);
 	_itemNum = actor->getObjId();
 	_type = 0x0204; // CONSTANT !
@@ -78,18 +79,12 @@ PathfinderProcess::PathfinderProcess(Actor *actor, ObjId item_, bool hit) :
 	actor->setActorFlag(Actor::ACT_PATHFINDING);
 }
 
-PathfinderProcess::PathfinderProcess(Actor *actor_,
-                                     int32 x, int32 y, int32 z) {
+PathfinderProcess::PathfinderProcess(Actor *actor_, int32 x, int32 y, int32 z) :
+		_targetX(x), _targetY(y), _targetZ(z), _targetItem(0), _currentStep(0),
+		_hitMode(false) {
 	assert(actor_);
 	_itemNum = actor_->getObjId();
 
-	_targetX = x;
-	_targetY = y;
-	_targetZ = z;
-	_targetItem = 0;
-
-	_currentStep = 0;
-
 	Pathfinder pf;
 	pf.init(actor_);
 	pf.setTarget(_targetX, _targetY, _targetZ);
diff --git a/engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp b/engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp
index 180cd9099f..6e83ce7e17 100644
--- a/engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp
+++ b/engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp
@@ -31,8 +31,8 @@ namespace Ultima8 {
 
 DEFINE_RUNTIME_CLASSTYPE_CODE(TeleportToEggProcess, Process)
 
-TeleportToEggProcess::TeleportToEggProcess() : Process() {
-
+TeleportToEggProcess::TeleportToEggProcess() : Process(),
+	_mapNum(0), _teleportId(0) {
 }
 
 
diff --git a/engines/ultima/ultima8/world/actors/weapon_overlay.h b/engines/ultima/ultima8/world/actors/weapon_overlay.h
index e8a066f3eb..411da2947d 100644
--- a/engines/ultima/ultima8/world/actors/weapon_overlay.h
+++ b/engines/ultima/ultima8/world/actors/weapon_overlay.h
@@ -38,8 +38,7 @@ struct WeaponOverlay {
 	unsigned int _dirCount;
 	Std::vector<WeaponOverlayFrame> *_frames; // 8 or 16 directions
 
-	WeaponOverlay() {
-		_frames = NULL;
+	WeaponOverlay() : _frames(nullptr), _dirCount(0) {
 	}
 	~WeaponOverlay() {
 		delete[] _frames;
diff --git a/engines/ultima/ultima8/world/camera_process.cpp b/engines/ultima/ultima8/world/camera_process.cpp
index 7f9c225adb..84f570255f 100644
--- a/engines/ultima/ultima8/world/camera_process.cpp
+++ b/engines/ultima/ultima8/world/camera_process.cpp
@@ -102,12 +102,14 @@ CameraProcess::CameraProcess(uint16 _itemnum) :
 
 	if (_itemNum) {
 		Item *item = getItem(_itemNum);
-
-		// Got it
 		if (item) {
 			item->setExtFlag(Item::EXT_CAMERA);
 			item->getLocation(_ex, _ey, _ez);
 			_ez += 20; //!!constant
+		} else {
+			_ex = 0;
+			_ey = 0;
+			_ez = 0;
 		}
 		return;
 	}
diff --git a/engines/ultima/ultima8/world/create_item_process.cpp b/engines/ultima/ultima8/world/create_item_process.cpp
index 059089f219..8cf65c9abe 100644
--- a/engines/ultima/ultima8/world/create_item_process.cpp
+++ b/engines/ultima/ultima8/world/create_item_process.cpp
@@ -32,17 +32,19 @@ namespace Ultima8 {
 DEFINE_RUNTIME_CLASSTYPE_CODE(CreateItemProcess, Process)
 
 CreateItemProcess::CreateItemProcess()
-	: Process() {
+	: Process(), _shape(0), _frame(0), _quality(0), _flags(0),
+	_npcNum(0), _mapNum(0), _extendedFlags(0),
+	_x(0), _y(0), _z(0) {
 
 }
 
-CreateItemProcess::CreateItemProcess(uint32 shape_, uint32 frame_,
-                                     uint16 quality_, uint16 flags_,
-                                     uint16 npcnum_, uint16 mapnum_,
-                                     uint32 extendedflags_,
+CreateItemProcess::CreateItemProcess(uint32 shape, uint32 frame,
+                                     uint16 quality, uint16 flags,
+                                     uint16 npcnum, uint16 mapnum,
+                                     uint32 extendedflags,
                                      int32 x, int32 y, int32 z)
-	: _shape(shape_), _frame(frame_), _quality(quality_), _flags(flags_),
-	  _npcNum(npcnum_), _mapNum(mapnum_), _extendedFlags(extendedflags_),
+	: _shape(shape), _frame(frame), _quality(quality), _flags(flags),
+	  _npcNum(npcnum), _mapNum(mapnum), _extendedFlags(extendedflags),
 	  _x(x), _y(y), _z(z) {
 
 }
diff --git a/engines/ultima/ultima8/world/gravity_process.cpp b/engines/ultima/ultima8/world/gravity_process.cpp
index 8afb0a3d3f..093a1f41df 100644
--- a/engines/ultima/ultima8/world/gravity_process.cpp
+++ b/engines/ultima/ultima8/world/gravity_process.cpp
@@ -36,7 +36,7 @@ namespace Ultima8 {
 DEFINE_RUNTIME_CLASSTYPE_CODE(GravityProcess, Process)
 
 GravityProcess::GravityProcess()
-	: Process() {
+	: Process(), _xSpeed(0), _ySpeed(0), _zSpeed(0), _gravity(0) {
 
 }
 
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index 72eb4298b7..0cb15593b2 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -2585,6 +2585,7 @@ uint32 Item::I_legalMoveToContainer(const uint8 *args, unsigned int /*argsize*/)
 	ARG_ITEM_FROM_PTR(item);
 	ARG_CONTAINER_FROM_PTR(container);
 	ARG_UINT16(unknown); // always 0
+	if (!item || !container) return 0; // shouldn't happen?
 
 	// try to move item to container checking weight and volume
 	return item->moveToContainer(container, true);
@@ -2840,7 +2841,7 @@ uint32 Item::I_canReach(const uint8 *args, unsigned int /*argsize*/) {
 
 	// TODO: add cheat to make this always return 1
 
-	if (item && item->canReach(other, range))
+	if (item && other && item->canReach(other, range))
 		return 1;
 	else
 		return 0;
diff --git a/engines/ultima/ultima8/world/item_sorter.cpp b/engines/ultima/ultima8/world/item_sorter.cpp
index 51563dd219..773de3c0f4 100644
--- a/engines/ultima/ultima8/world/item_sorter.cpp
+++ b/engines/ultima/ultima8/world/item_sorter.cpp
@@ -43,7 +43,14 @@ namespace Ultima8 {
 // This does NOT need to be in the header
 struct SortItem {
 	SortItem(SortItem *n) : _next(n), _prev(nullptr), _itemNum(0),
-			_shape(nullptr), _order(-1), _depends() { }
+			_shape(nullptr), _order(-1), _depends(), _shapeNum(0),
+			_frame(0), _flags(0), _extFlags(0), _sx(0), _sy(0),
+			_sx2(0), _sy2(0), _x(0), _y(0), _z(0), _xLeft(0),
+			_yFar(0), _zTop(0), _sxLeft(0), _sxRight(0), _sxTop(0),
+			_syTop(0), _sxBot(0), _syBot(0),_f32x32(false), _flat(false),
+			_occl(false), _solid(false), _draw(false), _roof(false),
+			_noisy(false), _anim(false), _trans(false), _fixed(false),
+			_land(false), _occluded(false), _clipped(0) { }
 
 	SortItem                *_next;
 	SortItem                *_prev;
@@ -575,7 +582,7 @@ inline bool SortItem::operator<<(const SortItem &si2) const {
 
 ItemSorter::ItemSorter() :
 	_shapes(nullptr), _surf(nullptr), _items(nullptr), _itemsTail(nullptr),
-	_itemsUnused(nullptr), _sortLimit(0) {
+	_itemsUnused(nullptr), _sortLimit(0), _camSx(0), _camSy(0), _orderCounter(0) {
 	int i = 2048;
 	while (i--) _itemsUnused = new SortItem(_itemsUnused);
 }
diff --git a/engines/ultima/ultima8/world/missile_tracker.cpp b/engines/ultima/ultima8/world/missile_tracker.cpp
index d173d2e228..bb6aa67564 100644
--- a/engines/ultima/ultima8/world/missile_tracker.cpp
+++ b/engines/ultima/ultima8/world/missile_tracker.cpp
@@ -34,25 +34,19 @@ namespace Ultima8 {
 
 MissileTracker::MissileTracker(Item *item, int32 sx, int32 sy, int32 sz,
                                int32 tx, int32 ty, int32 tz,
-                               int32 speed, int32 gravity_) {
+                               int32 speed, int32 gravity) :
+		_destX(tx), _destY(ty), _destZ(tz), _gravity(gravity) {
 	_objId = item->getObjId();
-	_destX = tx;
-	_destY = ty;
-	_destZ = tz;
-	_gravity = gravity_;
 
 	init(sx, sy, sz, speed);
 }
 
 MissileTracker::MissileTracker(Item *item, int32 tx, int32 ty, int32 tz,
-                               int32 speed, int32 gravity_) {
+                               int32 speed, int32 gravity) :
+		  _destX(tx), _destY(ty), _destZ(tz), _gravity(gravity)  {
 	assert(item->getParent() == 0);
 
 	_objId = item->getObjId();
-	_destX = tx;
-	_destY = ty;
-	_destZ = tz;
-	_gravity = gravity_;
 
 	int32 x, y, z;
 	item->getLocation(x, y, z);
@@ -140,6 +134,11 @@ bool MissileTracker::isPathClear() {
 	CurrentMap *map = world->getCurrentMap();
 	Item *item = getItem(_objId);
 
+	if (!item) {
+		// Item disappeared? shouldn't happen, but call the path clear.
+		return true;
+	}
+
 	item->getFootpadWorld(dims[0], dims[1], dims[2]);
 	item->getLocation(start[0], start[1], start[2]);
 
diff --git a/engines/ultima/ultima8/world/sprite_process.cpp b/engines/ultima/ultima8/world/sprite_process.cpp
index ec9261bab3..108bacff95 100644
--- a/engines/ultima/ultima8/world/sprite_process.cpp
+++ b/engines/ultima/ultima8/world/sprite_process.cpp
@@ -35,15 +35,16 @@ namespace Ultima8 {
 DEFINE_RUNTIME_CLASSTYPE_CODE(SpriteProcess, Process)
 
 SpriteProcess::SpriteProcess()
-	: Process() {
-
+	: Process(), _shape(0), _frame(0), _firstFrame(0), _lastFrame(0),
+	_repeats(0), _delay(0), _x(0), _y(0), _z(0), _delayCounter(0),
+	_initialized(false) {
 }
 
-SpriteProcess::SpriteProcess(int Shape, int Frame, int LastFrame,
-                             int Repeats, int Delay, int x, int y, int z,
+SpriteProcess::SpriteProcess(int shape, int frame, int lastFrame,
+                             int repeats, int delay, int x, int y, int z,
                              bool delayed_init) :
-	_shape(Shape), _frame(Frame), _firstFrame(Frame), _lastFrame(LastFrame),
-	_repeats(Repeats), _delay(Delay * 2), _x(x), _y(y), _z(z), _delayCounter(0),
+	_shape(shape), _frame(frame), _firstFrame(frame), _lastFrame(lastFrame),
+	_repeats(repeats), _delay(delay * 2), _x(x), _y(y), _z(z), _delayCounter(0),
 	_initialized(false) {
 	if (!delayed_init)
 		init();




More information about the Scummvm-git-logs mailing list