From 0aa9b0d1b4005d44d8bc9fb6e72965e69ae73b17 Mon Sep 17 00:00:00 2001 From: John Beard Date: Fri, 14 Mar 2025 22:13:58 +0800 Subject: [PATCH] C++: Use unsigned size type for loop index This avoids a wrong sign conversion when the loop expression casts to a negative signed int. Fixes: https://github.com/kaitai-io/kaitai_struct/issues/1220 --- .../main/scala/io/kaitai/struct/languages/CppCompiler.scala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/shared/src/main/scala/io/kaitai/struct/languages/CppCompiler.scala b/shared/src/main/scala/io/kaitai/struct/languages/CppCompiler.scala index 6411161a1..f24a56c64 100644 --- a/shared/src/main/scala/io/kaitai/struct/languages/CppCompiler.scala +++ b/shared/src/main/scala/io/kaitai/struct/languages/CppCompiler.scala @@ -593,8 +593,10 @@ class CppCompiler( override def condRepeatExprHeader(id: Identifier, io: String, dataType: DataType, repeatExpr: Ast.expr): Unit = { val lenVar = s"l_${idToStr(id)}" - outSrc.puts(s"const int $lenVar = ${expression(repeatExpr)};") - outSrc.puts(s"for (int i = 0; i < $lenVar; i++) {") + val cppElType = kaitaiType2NativeType(dataType) + val sizeType = s"std::vector<$cppElType>::size_type" + outSrc.puts(s"const $sizeType $lenVar = ${expression(repeatExpr)};") + outSrc.puts(s"for ($sizeType i = 0; i < $lenVar; i++) {") outSrc.inc }