[Scummvm-git-logs] scummvm master -> 6c76adfa4ffe6221ce2987d4ae94b263f8eeb511

Helco noreply at scummvm.org
Tue Sep 16 11:10:36 UTC 2025


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

Summary:
d0d6aec72e ALCACHOFA: Qualify virtual method calls in constructors. PVS-Studio V1053
662bc5fac6 ALCACHOFA: Initialize all members in structs. PVS-Studio V730
be9f412881 ALCACHOFA: Suppress false-positive unreachable-code and identical-sub-expression warnings. PVS-Studio V501, V779
b7790efa5e ALCACHOFA: Add copy assignment to classes with copy ctor. PVS-Studio V690
e22c35f8fb ALCACHOFA: Fix one-off warnings. PVS-Studio V558, V1009, V699, V764, V595, V773, V1037, V560, V668
6c76adfa4f ALCACHOFA: Fix potential null-pointer dereferences. PVS-Studio V522


Commit: d0d6aec72e8cdec0d7d3bd3ae2166c12e5436cdd
    https://github.com/scummvm/scummvm/commit/d0d6aec72e8cdec0d7d3bd3ae2166c12e5436cdd
Author: Helco (hermann.noll at hotmail.com)
Date: 2025-09-16T12:04:12+02:00

Commit Message:
ALCACHOFA: Qualify virtual method calls in constructors. PVS-Studio V1053

Changed paths:
    engines/alcachofa/alcachofa.cpp
    engines/alcachofa/game-objects.cpp
    engines/alcachofa/general-objects.cpp
    engines/alcachofa/global-ui.cpp
    engines/alcachofa/graphics.cpp
    engines/alcachofa/player.cpp
    engines/alcachofa/scheduler.h
    engines/alcachofa/script.cpp


diff --git a/engines/alcachofa/alcachofa.cpp b/engines/alcachofa/alcachofa.cpp
index 2bb9096fe41..486688eaab0 100644
--- a/engines/alcachofa/alcachofa.cpp
+++ b/engines/alcachofa/alcachofa.cpp
@@ -435,7 +435,7 @@ DelayTask::DelayTask(Process &process, uint32 millis)
 
 DelayTask::DelayTask(Process &process, Serializer &s)
 	: Task(process) {
-	syncGame(s);
+	DelayTask::syncGame(s);
 }
 
 TaskReturn DelayTask::run() {
diff --git a/engines/alcachofa/game-objects.cpp b/engines/alcachofa/game-objects.cpp
index 1954551be68..18d08184548 100644
--- a/engines/alcachofa/game-objects.cpp
+++ b/engines/alcachofa/game-objects.cpp
@@ -767,14 +767,14 @@ void WalkingCharacter::syncGame(Serializer &serializer) {
 	syncEnum(serializer, _direction);
 }
 
-struct ArriveTask : public Task {
+struct ArriveTask final : public Task {
 	ArriveTask(Process &process, const WalkingCharacter *character)
 		: Task(process)
 		, _character(character) {}
 
 	ArriveTask(Process &process, Serializer &s)
 		: Task(process) {
-		syncGame(s);
+		ArriveTask::syncGame(s);
 	}
 
 	TaskReturn run() override {
@@ -1025,7 +1025,7 @@ bool MainCharacter::clearTargetIf(const ITriggerableObject *target) {
 	return false;
 }
 
-struct DialogMenuTask : public Task {
+struct DialogMenuTask final : public Task {
 	DialogMenuTask(Process &process, MainCharacter *character)
 		: Task(process)
 		, _input(g_engine->input())
@@ -1034,7 +1034,7 @@ struct DialogMenuTask : public Task {
 	DialogMenuTask(Process &process, Serializer &s)
 		: Task(process)
 		, _input(g_engine->input()) {
-		syncGame(s);
+		DialogMenuTask::syncGame(s);
 	}
 
 	TaskReturn run() override {
diff --git a/engines/alcachofa/general-objects.cpp b/engines/alcachofa/general-objects.cpp
index fde931008eb..0b8aee369ce 100644
--- a/engines/alcachofa/general-objects.cpp
+++ b/engines/alcachofa/general-objects.cpp
@@ -151,7 +151,7 @@ Graphic *GraphicObject::graphic() {
 	return &_graphic;
 }
 
-struct AnimateTask : public Task {
+struct AnimateTask final : public Task {
 	AnimateTask(Process &process, GraphicObject *object)
 		: Task(process)
 		, _object(object) {
@@ -163,7 +163,7 @@ struct AnimateTask : public Task {
 
 	AnimateTask(Process &process, Serializer &s)
 		: Task(process) {
-		syncGame(s);
+		AnimateTask::syncGame(s);
 	}
 
 	TaskReturn run() override {
diff --git a/engines/alcachofa/global-ui.cpp b/engines/alcachofa/global-ui.cpp
index 938fefd8fc1..7d9f7654697 100644
--- a/engines/alcachofa/global-ui.cpp
+++ b/engines/alcachofa/global-ui.cpp
@@ -190,7 +190,7 @@ void GlobalUI::drawChangingButton() {
 	g_engine->drawQueue().add<AnimationDrawRequest>(_changeButton, false, BlendMode::AdditiveAlpha);
 }
 
-struct CenterBottomTextTask : public Task {
+struct CenterBottomTextTask final : public Task {
 	CenterBottomTextTask(Process &process, int32 dialogId, uint32 durationMs)
 		: Task(process)
 		, _dialogId(dialogId)
@@ -198,7 +198,7 @@ struct CenterBottomTextTask : public Task {
 
 	CenterBottomTextTask(Process &process, Serializer &s)
 		: Task(process) {
-		syncGame(s);
+		CenterBottomTextTask::syncGame(s);
 	}
 
 	TaskReturn run() override {
diff --git a/engines/alcachofa/graphics.cpp b/engines/alcachofa/graphics.cpp
index ebbf2e6e8c3..7057d8aaa92 100644
--- a/engines/alcachofa/graphics.cpp
+++ b/engines/alcachofa/graphics.cpp
@@ -795,7 +795,7 @@ void FadeDrawRequest::draw() {
 	g_engine->renderer().quad(Vector2d(0, 0), as2D(Point(g_system->getWidth(), g_system->getHeight())), color);
 }
 
-struct FadeTask : public Task {
+struct FadeTask final : public Task {
 	FadeTask(Process &process, FadeType fadeType,
 		float from, float to,
 		uint32 duration, EasingType easingType,
@@ -812,7 +812,7 @@ struct FadeTask : public Task {
 
 	FadeTask(Process &process, Serializer &s)
 		: Task(process) {
-		syncGame(s);
+		FadeTask::syncGame(s);
 	}
 
 	TaskReturn run() override {
diff --git a/engines/alcachofa/player.cpp b/engines/alcachofa/player.cpp
index 80f7f519a67..2a172c43ea9 100644
--- a/engines/alcachofa/player.cpp
+++ b/engines/alcachofa/player.cpp
@@ -205,7 +205,7 @@ void Player::triggerObject(ObjectBase *object, const char *action) {
 		script.createProcess(activeCharacterKind(), "DefectoUsar");
 }
 
-struct DoorTask : public Task {
+struct DoorTask final : public Task {
 	DoorTask(Process &process, const Door *door, FakeLock &&lock)
 		: Task(process)
 		, _lock(move(lock))
@@ -223,7 +223,7 @@ struct DoorTask : public Task {
 	DoorTask(Process &process, Serializer &s)
 		: Task(process)
 		, _player(g_engine->player()) {
-		syncGame(s);
+		DoorTask::syncGame(s);
 	}
 
 	TaskReturn run() override {
diff --git a/engines/alcachofa/scheduler.h b/engines/alcachofa/scheduler.h
index f29194a92f8..fa88887be44 100644
--- a/engines/alcachofa/scheduler.h
+++ b/engines/alcachofa/scheduler.h
@@ -115,7 +115,7 @@ private:
 
 // implemented in alcachofa.cpp to prevent a compiler warning when
 // the declaration of the construct function comes after the definition
-struct DelayTask : public Task {
+struct DelayTask final : public Task {
 	DelayTask(Process &process, uint32 millis);
 	DelayTask(Process &process, Common::Serializer &s);
 	TaskReturn run() override;
diff --git a/engines/alcachofa/script.cpp b/engines/alcachofa/script.cpp
index 2296266940b..f08c9ccafbe 100644
--- a/engines/alcachofa/script.cpp
+++ b/engines/alcachofa/script.cpp
@@ -130,14 +130,14 @@ bool Script::hasProcedure(const Common::String &procedure) const {
 	return _procedures.contains(procedure);
 }
 
-struct ScriptTimerTask : public Task {
+struct ScriptTimerTask final : public Task {
 	ScriptTimerTask(Process &process, int32 durationSec)
 		: Task(process)
 		, _durationSec(durationSec) {}
 
 	ScriptTimerTask(Process &process, Serializer &s)
 		: Task(process) {
-		syncGame(s);
+		ScriptTimerTask::syncGame(s);
 	}
 
 	TaskReturn run() override {
@@ -201,7 +201,7 @@ struct StackEntry {
 	};
 };
 
-struct ScriptTask : public Task {
+struct ScriptTask final : public Task {
 	ScriptTask(Process &process, const String &name, uint32 pc, FakeLock &&lock)
 		: Task(process)
 		, _script(g_engine->script())
@@ -227,7 +227,7 @@ struct ScriptTask : public Task {
 	ScriptTask(Process &process, Serializer &s)
 		: Task(process)
 		, _script(g_engine->script()) {
-		syncGame(s);
+		ScriptTask::syncGame(s);
 	}
 
 	TaskReturn run() override {


Commit: 662bc5fac6d0311bd7d288ecbe99b3e95cb710d2
    https://github.com/scummvm/scummvm/commit/662bc5fac6d0311bd7d288ecbe99b3e95cb710d2
Author: Helco (hermann.noll at hotmail.com)
Date: 2025-09-16T12:04:12+02:00

Commit Message:
ALCACHOFA: Initialize all members in structs. PVS-Studio V730

Changed paths:
    engines/alcachofa/debug.h
    engines/alcachofa/objects.h
    engines/alcachofa/sounds.h


diff --git a/engines/alcachofa/debug.h b/engines/alcachofa/debug.h
index 8ebc8adc7d0..d3f59192b15 100644
--- a/engines/alcachofa/debug.h
+++ b/engines/alcachofa/debug.h
@@ -160,7 +160,7 @@ class FloorColorDebugHandler final : public IDebugHandler {
 	Color _curColor = kDebugGreen;
 	bool _isOnFloor = false;
 	static constexpr size_t kBufferSize = 64;
-	char _buffer[kBufferSize];
+	char _buffer[kBufferSize] = { 0 };
 
 	FloorColorDebugHandler(const FloorColorShape &shape, bool useColor)
 		: _shape(shape)
diff --git a/engines/alcachofa/objects.h b/engines/alcachofa/objects.h
index cb0af316396..ad6672e6ba5 100644
--- a/engines/alcachofa/objects.h
+++ b/engines/alcachofa/objects.h
@@ -520,7 +520,7 @@ protected:
 };
 
 struct DialogMenuLine {
-	int32 _dialogId;
+	int32 _dialogId = -1;
 	int32 _yPosition = 0;
 	int32 _returnValue = 0;
 };
diff --git a/engines/alcachofa/sounds.h b/engines/alcachofa/sounds.h
index 895b0bf5e3c..693fd1a934a 100644
--- a/engines/alcachofa/sounds.h
+++ b/engines/alcachofa/sounds.h
@@ -68,7 +68,7 @@ private:
 		Audio::Mixer::SoundType _type = Audio::Mixer::SoundType::kPlainSoundType;
 		uint32 _fadeStart = 0,
 			_fadeDuration = 0;
-		int _inputRate;
+		int _inputRate = 0;
 		Common::Array<int16> _samples; ///< might not be filled, only voice samples are preloaded for lip-sync
 	};
 	Playback *getPlaybackById(SoundHandle id);


Commit: be9f4128810c5d7653e802dbc3ce141a1670d1d4
    https://github.com/scummvm/scummvm/commit/be9f4128810c5d7653e802dbc3ce141a1670d1d4
Author: Helco (hermann.noll at hotmail.com)
Date: 2025-09-16T12:04:12+02:00

Commit Message:
ALCACHOFA: Suppress false-positive unreachable-code and identical-sub-expression warnings. PVS-Studio V501, V779

Changed paths:
    engines/alcachofa/game-objects.cpp
    engines/alcachofa/general-objects.cpp
    engines/alcachofa/player.cpp
    engines/alcachofa/script.cpp


diff --git a/engines/alcachofa/game-objects.cpp b/engines/alcachofa/game-objects.cpp
index 18d08184548..8bfd05ca866 100644
--- a/engines/alcachofa/game-objects.cpp
+++ b/engines/alcachofa/game-objects.cpp
@@ -330,7 +330,7 @@ struct SayTextTask final : public Task {
 			if (!_character->_isTalking) {
 				g_engine->sounds().fadeOut(_soundHandle, 100);
 				TASK_WAIT(1, delay(200));
-				TASK_RETURN(0);
+				TASK_RETURN(0); //-V779
 			}
 
 			_character->isSpeaking() = !isSoundStillPlaying ||
@@ -406,7 +406,7 @@ struct AnimateCharacterTask final : public Task {
 			_graphic->update();
 		do {
 			TASK_YIELD(2);
-			if (process().isActiveForPlayer() && g_engine->input().wasAnyMouseReleased())
+			if (process().isActiveForPlayer() && g_engine->input().wasAnyMouseReleased()) //-V779
 				_graphic->pause();
 		} while (!_graphic->isPaused());
 
@@ -1042,7 +1042,7 @@ struct DialogMenuTask final : public Task {
 		layoutLines();
 		while (true) {
 			TASK_YIELD(1);
-			if (g_engine->player().activeCharacter() != _character)
+			if (g_engine->player().activeCharacter() != _character) //-V779
 				continue;
 			g_engine->globalUI().updateChangingCharacter();
 			g_engine->player().heldItem() = nullptr;
diff --git a/engines/alcachofa/general-objects.cpp b/engines/alcachofa/general-objects.cpp
index 0b8aee369ce..8ef4fe55f02 100644
--- a/engines/alcachofa/general-objects.cpp
+++ b/engines/alcachofa/general-objects.cpp
@@ -171,7 +171,7 @@ struct AnimateTask final : public Task {
 		_object->toggle(true);
 		_graphic->start(false);
 		TASK_WAIT(1, delay(_duration));
-		_object->toggle(false);
+		_object->toggle(false); //-V779
 		TASK_END;
 	}
 
diff --git a/engines/alcachofa/player.cpp b/engines/alcachofa/player.cpp
index 2a172c43ea9..9f6bdb16c6b 100644
--- a/engines/alcachofa/player.cpp
+++ b/engines/alcachofa/player.cpp
@@ -235,7 +235,7 @@ struct DoorTask final : public Task {
 		if (g_engine->sounds().musicID() != _targetRoom->musicID())
 			g_engine->sounds().fadeMusic();
 		TASK_WAIT(1, fade(process(), FadeType::ToBlack, 0, 1, 500, EasingType::Out, -5));
-		_player.changeRoom(_targetRoom->name(), true);
+		_player.changeRoom(_targetRoom->name(), true); //-V779
 
 		if (_targetRoom->fixedCameraOnEntering())
 			g_engine->camera().setPosition(as2D(_targetObject->interactionPoint()));
diff --git a/engines/alcachofa/script.cpp b/engines/alcachofa/script.cpp
index f08c9ccafbe..6606971322d 100644
--- a/engines/alcachofa/script.cpp
+++ b/engines/alcachofa/script.cpp
@@ -152,7 +152,7 @@ struct ScriptTimerTask final : public Task {
 			g_engine->player().drawCursor();
 		}
 		TASK_YIELD(1); // Wait a frame to not produce an endless loop
-		TASK_RETURN(_result);
+		TASK_RETURN(_result); //-V779
 		TASK_END;
 	}
 
@@ -337,28 +337,28 @@ struct ScriptTask final : public Task {
 				pushNumber(-popNumber() + popNumber());
 				break;
 			case ScriptOp::Less:
-				pushNumber(popNumber() > popNumber());
+				pushNumber(popNumber() > popNumber()); //-V501
 				break;
 			case ScriptOp::Greater:
-				pushNumber(popNumber() < popNumber());
+				pushNumber(popNumber() < popNumber()); //-V501
 				break;
 			case ScriptOp::LessEquals:
-				pushNumber(popNumber() >= popNumber());
+				pushNumber(popNumber() >= popNumber()); //-V501
 				break;
 			case ScriptOp::GreaterEquals:
-				pushNumber(popNumber() <= popNumber());
+				pushNumber(popNumber() <= popNumber()); //-V501
 				break;
 			case ScriptOp::Equals:
-				pushNumber(popNumber() == popNumber());
+				pushNumber(popNumber() == popNumber()); //-V501
 				break;
 			case ScriptOp::NotEquals:
-				pushNumber(popNumber() != popNumber());
+				pushNumber(popNumber() != popNumber()); //-V501
 				break;
 			case ScriptOp::BitAnd:
-				pushNumber(popNumber() & popNumber());
+				pushNumber(popNumber() & popNumber()); //-V501
 				break;
 			case ScriptOp::BitOr:
-				pushNumber(popNumber() | popNumber());
+				pushNumber(popNumber() | popNumber()); //-V501
 				break;
 			case ScriptOp::Return: {
 				int32 returnValue = popNumber();


Commit: b7790efa5edc604b1319c399291865be94d7f7eb
    https://github.com/scummvm/scummvm/commit/b7790efa5edc604b1319c399291865be94d7f7eb
Author: Helco (hermann.noll at hotmail.com)
Date: 2025-09-16T12:04:12+02:00

Commit Message:
ALCACHOFA: Add copy assignment to classes with copy ctor. PVS-Studio V690

Changed paths:
    engines/alcachofa/common.cpp
    engines/alcachofa/common.h
    engines/alcachofa/graphics.cpp
    engines/alcachofa/graphics.h
    engines/alcachofa/objects.h


diff --git a/engines/alcachofa/common.cpp b/engines/alcachofa/common.cpp
index 9973fe98fc2..dc4b8c5a0a7 100644
--- a/engines/alcachofa/common.cpp
+++ b/engines/alcachofa/common.cpp
@@ -100,6 +100,16 @@ void FakeLock::operator= (FakeLock &&other) {
 	debug("move-assign");
 }
 
+FakeLock &FakeLock::operator= (const FakeLock &other) {
+	release();
+	_name = other._name;
+	_semaphore = other._semaphore;
+	if (_semaphore != nullptr)
+		_semaphore->_counter++;
+	debug("copy-assign");
+	return *this;
+}
+
 void FakeLock::release() {
 	if (_semaphore == nullptr)
 		return;
diff --git a/engines/alcachofa/common.h b/engines/alcachofa/common.h
index 4009645aaaf..a28ac48fe79 100644
--- a/engines/alcachofa/common.h
+++ b/engines/alcachofa/common.h
@@ -101,7 +101,8 @@ struct FakeLock {
 	FakeLock(const FakeLock &other);
 	FakeLock(FakeLock &&other);
 	~FakeLock();
-	void operator = (FakeLock &&other);
+	void operator= (FakeLock &&other);
+	FakeLock &operator= (const FakeLock &other);
 	void release();
 
 	inline bool isReleased() const { return _semaphore == nullptr; }
diff --git a/engines/alcachofa/graphics.cpp b/engines/alcachofa/graphics.cpp
index 7057d8aaa92..a1f1eddabcb 100644
--- a/engines/alcachofa/graphics.cpp
+++ b/engines/alcachofa/graphics.cpp
@@ -522,6 +522,21 @@ Graphic::Graphic(const Graphic &other)
 	, _frameI(other._frameI)
 	, _depthScale(other._depthScale) {}
 
+Graphic &Graphic::operator= (const Graphic &other) {
+	_ownedAnimation.reset();
+	_animation = other._animation;
+	_topLeft = other._topLeft;
+	_scale = other._scale;
+	_order = other._order;
+	_color = other._color;
+	_isPaused = other._isPaused;
+	_isLooping = other._isLooping;
+	_lastTime = other._lastTime;
+	_frameI = other._frameI;
+	_depthScale = other._depthScale;
+	return *this;
+}
+
 void Graphic::loadResources() {
 	if (_animation != nullptr)
 		_animation->load();
diff --git a/engines/alcachofa/graphics.h b/engines/alcachofa/graphics.h
index d095a3e880b..9db32224bc7 100644
--- a/engines/alcachofa/graphics.h
+++ b/engines/alcachofa/graphics.h
@@ -259,6 +259,7 @@ public:
 	Graphic();
 	Graphic(Common::ReadStream &stream);
 	Graphic(const Graphic &other); // animation reference is taken, so keep other alive
+	Graphic &operator= (const Graphic &other);
 
 	inline Common::Point &topLeft() { return _topLeft; }
 	inline int8 &order() { return _order; }
diff --git a/engines/alcachofa/objects.h b/engines/alcachofa/objects.h
index ad6672e6ba5..46f3ebb0600 100644
--- a/engines/alcachofa/objects.h
+++ b/engines/alcachofa/objects.h
@@ -351,11 +351,12 @@ public:
 	const char *typeName() const override;
 };
 
-class Item : public GraphicObject {
+class Item : public GraphicObject { //-V690
 public:
 	static constexpr const char *kClassName = "CObjetoInventario";
 	Item(Room *room, Common::ReadStream &stream);
 	Item(const Item &other);
+	// no copy-assign operator as it is non-sensical, the copy ctor is a special case for item-handling
 
 	void draw() override;
 	const char *typeName() const override;


Commit: e22c35f8fb071a59a367cb42839e2d718bc7f3f4
    https://github.com/scummvm/scummvm/commit/e22c35f8fb071a59a367cb42839e2d718bc7f3f4
Author: Helco (hermann.noll at hotmail.com)
Date: 2025-09-16T12:04:12+02:00

Commit Message:
ALCACHOFA: Fix one-off warnings. PVS-Studio V558, V1009, V699, V764, V595, V773, V1037, V560, V668

Changed paths:
    engines/alcachofa/alcachofa.cpp
    engines/alcachofa/common.cpp
    engines/alcachofa/graphics-tinygl.cpp
    engines/alcachofa/graphics.cpp
    engines/alcachofa/graphics.h
    engines/alcachofa/rooms.cpp
    engines/alcachofa/shape.cpp
    engines/alcachofa/shape.h


diff --git a/engines/alcachofa/alcachofa.cpp b/engines/alcachofa/alcachofa.cpp
index 486688eaab0..b1662a37441 100644
--- a/engines/alcachofa/alcachofa.cpp
+++ b/engines/alcachofa/alcachofa.cpp
@@ -61,6 +61,8 @@ AlcachofaEngine::AlcachofaEngine(OSystem *syst, const ADGameDescription *gameDes
 }
 
 AlcachofaEngine::~AlcachofaEngine() {
+	// do not delete, this is done by `Engine::~Engine` with `delete _debugger;`
+	_console = nullptr;
 }
 
 uint32 AlcachofaEngine::getFeatures() const {
@@ -108,8 +110,9 @@ Common::Error AlcachofaEngine::run() {
 		_drawQueue->clear();
 		_camera.shake() = Vector2d();
 		_player->preUpdate();
-		_player->currentRoom()->update();
 		if (_player->currentRoom() != nullptr)
+			_player->currentRoom()->update();
+		if (_player->currentRoom() != nullptr) // update() might clear currentRoom
 			_player->currentRoom()->draw();
 		_player->postUpdate();
 		if (_debugHandler != nullptr)
diff --git a/engines/alcachofa/common.cpp b/engines/alcachofa/common.cpp
index dc4b8c5a0a7..f59a5d81d18 100644
--- a/engines/alcachofa/common.cpp
+++ b/engines/alcachofa/common.cpp
@@ -167,7 +167,7 @@ String readVarString(ReadStream &stream) {
 		return Common::String();
 
 	char *buffer = new char[length];
-	if (buffer == nullptr)
+	if (buffer == nullptr) //-V668
 		error("Out of memory in readVarString");
 	if (stream.read(buffer, length) != length)
 		error("Could not read all %u bytes in readVarString", length);
diff --git a/engines/alcachofa/graphics-tinygl.cpp b/engines/alcachofa/graphics-tinygl.cpp
index 4ce2dd68dc2..90d84ed2200 100644
--- a/engines/alcachofa/graphics-tinygl.cpp
+++ b/engines/alcachofa/graphics-tinygl.cpp
@@ -127,6 +127,7 @@ public:
 			return;
 		switch (blendMode) {
 		case BlendMode::AdditiveAlpha:
+		case BlendMode::Tinted:
 			tglBlendFunc(TGL_ONE, TGL_ONE_MINUS_SRC_ALPHA);
 			break;
 		case BlendMode::Additive:
@@ -138,9 +139,6 @@ public:
 		case BlendMode::Alpha:
 			tglBlendFunc(TGL_SRC_ALPHA, TGL_ONE_MINUS_SRC_ALPHA);
 			break;
-		case BlendMode::Tinted:
-			tglBlendFunc(TGL_ONE, TGL_ONE_MINUS_SRC_ALPHA);
-			break;
 		default: assert(false && "Invalid blend mode"); break;
 		}
 
diff --git a/engines/alcachofa/graphics.cpp b/engines/alcachofa/graphics.cpp
index a1f1eddabcb..14dd5512cf3 100644
--- a/engines/alcachofa/graphics.cpp
+++ b/engines/alcachofa/graphics.cpp
@@ -564,7 +564,8 @@ void Graphic::update() {
 			curTime %= totalDuration;
 		else {
 			pause();
-			curTime = _lastTime = totalDuration ? totalDuration - 1 : 0;
+			curTime = totalDuration ? totalDuration - 1 : 0;
+			_lastTime = curTime;
 		}
 	}
 
diff --git a/engines/alcachofa/graphics.h b/engines/alcachofa/graphics.h
index 9db32224bc7..26b8bbd6bdb 100644
--- a/engines/alcachofa/graphics.h
+++ b/engines/alcachofa/graphics.h
@@ -168,7 +168,7 @@ protected:
 	bool _isLoaded = false;
 	uint32 _totalDuration = 0;
 
-	int32 _spriteIndexMapping[kMaxSpriteIDs] = { -1 };
+	int32 _spriteIndexMapping[kMaxSpriteIDs] = { 0 };
 	Common::Array<uint32>
 		_spriteOffsets, ///< index offset per sprite and animation frame
 		_spriteBases; ///< base index per sprite
diff --git a/engines/alcachofa/rooms.cpp b/engines/alcachofa/rooms.cpp
index 3764a82664e..ffadfffe641 100644
--- a/engines/alcachofa/rooms.cpp
+++ b/engines/alcachofa/rooms.cpp
@@ -566,7 +566,7 @@ Room *World::getRoomByName(const char *name) const {
 
 ObjectBase *World::getObjectByName(const char *name) const {
 	ObjectBase *result = nullptr;
-	if (result == nullptr && g_engine->player().currentRoom() != nullptr)
+	if (g_engine->player().currentRoom() != nullptr)
 		result = g_engine->player().currentRoom()->getObjectByName(name);
 	if (result == nullptr)
 		result = globalRoom().getObjectByName(name);
diff --git a/engines/alcachofa/shape.cpp b/engines/alcachofa/shape.cpp
index 5db327f47e3..3a2c1fda964 100644
--- a/engines/alcachofa/shape.cpp
+++ b/engines/alcachofa/shape.cpp
@@ -40,12 +40,12 @@ static bool segmentsIntersect(Point a1, Point b1, Point a2, Point b2) {
 	// rather than using common Math:: code
 	if (a2.x > b2.x) {
 		if (a1.x > b1.x)
-			return lineIntersects(b1, a1, b2, a2) && lineIntersects(b2, a2, b1, a1);
+			return lineIntersects(b1, a1, b2, a2) && lineIntersects(b2, a2, b1, a1); //-V764
 		else
-			return lineIntersects(a1, b1, b2, a2) && lineIntersects(b2, a2, a1, b1);
+			return lineIntersects(a1, b1, b2, a2) && lineIntersects(b2, a2, a1, b1); //-V764
 	} else {
 		if (a1.x > b1.x)
-			return lineIntersects(b1, a1, a2, b2) && lineIntersects(a2, b2, b1, a1);
+			return lineIntersects(b1, a1, a2, b2) && lineIntersects(a2, b2, b1, a1); //-V764
 		else
 			return lineIntersects(a1, b1, a2, b2) && lineIntersects(a2, b2, a1, b1);
 	}
diff --git a/engines/alcachofa/shape.h b/engines/alcachofa/shape.h
index 3ac64f41e19..24eda2557fc 100644
--- a/engines/alcachofa/shape.h
+++ b/engines/alcachofa/shape.h
@@ -89,7 +89,7 @@ struct PolygonIterator {
 		return *this;
 	}
 
-	inline my_type &operator++(int) {
+	inline my_type operator++(int) {
 		assert(_index < _shape.polygonCount());
 		auto tmp = *this;
 		++*this;


Commit: 6c76adfa4ffe6221ce2987d4ae94b263f8eeb511
    https://github.com/scummvm/scummvm/commit/6c76adfa4ffe6221ce2987d4ae94b263f8eeb511
Author: Helco (hermann.noll at hotmail.com)
Date: 2025-09-16T12:04:12+02:00

Commit Message:
ALCACHOFA: Fix potential null-pointer dereferences. PVS-Studio V522

Changed paths:
    engines/alcachofa/graphics-opengl-classic.cpp
    engines/alcachofa/graphics-tinygl.cpp
    engines/alcachofa/ui-objects.cpp


diff --git a/engines/alcachofa/graphics-opengl-classic.cpp b/engines/alcachofa/graphics-opengl-classic.cpp
index 8bf311c4d61..9577e90d6db 100644
--- a/engines/alcachofa/graphics-opengl-classic.cpp
+++ b/engines/alcachofa/graphics-opengl-classic.cpp
@@ -57,7 +57,7 @@ public:
 			}
 			auto glTexture = dynamic_cast<OpenGLTexture *>(texture);
 			assert(glTexture != nullptr);
-			GL_CALL(glBindTexture(GL_TEXTURE_2D, glTexture->handle()));
+			GL_CALL(glBindTexture(GL_TEXTURE_2D, glTexture->handle())); //-V522
 			_currentTexture = glTexture;
 		}
 	}
diff --git a/engines/alcachofa/graphics-tinygl.cpp b/engines/alcachofa/graphics-tinygl.cpp
index 90d84ed2200..76990e882a5 100644
--- a/engines/alcachofa/graphics-tinygl.cpp
+++ b/engines/alcachofa/graphics-tinygl.cpp
@@ -117,7 +117,7 @@ public:
 			}
 			auto glTexture = dynamic_cast<TinyGLTexture *>(texture);
 			assert(glTexture != nullptr);
-			tglBindTexture(TGL_TEXTURE_2D, glTexture->handle());
+			tglBindTexture(TGL_TEXTURE_2D, glTexture->handle()); //-V522
 			_currentTexture = glTexture;
 		}
 	}
diff --git a/engines/alcachofa/ui-objects.cpp b/engines/alcachofa/ui-objects.cpp
index ca0b73b67f8..534115b1245 100644
--- a/engines/alcachofa/ui-objects.cpp
+++ b/engines/alcachofa/ui-objects.cpp
@@ -248,7 +248,7 @@ SlideButton::SlideButton(Room *room, ReadStream &stream)
 
 void SlideButton::draw() {
 	auto *optionsMenu = dynamic_cast<OptionsMenu *>(room());
-	assert(optionsMenu != nullptr);
+	scumm_assert(optionsMenu != nullptr);
 
 	Graphic *activeGraphic;
 	if (optionsMenu->currentSlideButton() == this && g_engine->input().isMouseLeftDown())
@@ -262,7 +262,7 @@ void SlideButton::draw() {
 void SlideButton::update() {
 	const auto mousePos = g_engine->input().mousePos2D();
 	auto *optionsMenu = dynamic_cast<OptionsMenu *>(room());
-	assert(optionsMenu != nullptr);
+	scumm_assert(optionsMenu != nullptr);
 
 	if (optionsMenu->currentSlideButton() == this) {
 		if (!g_engine->input().isMouseLeftDown()) {




More information about the Scummvm-git-logs mailing list