martin-g commented on code in PR #3646:
URL: https://github.com/apache/avro/pull/3646#discussion_r2780921649


##########
lang/c++/test/CodecTests.cc:
##########
@@ -2100,6 +2100,42 @@ static void testJsonCodecReinit() {
     }
 }
 
+static void testArrayNegativeBlockCount() {

Review Comment:
   This test pass even without the fix above.
   The reason is that the negative count is in the first block and this uses 
`arrayStart()` which already delegates to `doDecodeItemCount()`.
   
   Please update the test to use a negative count [also] in the second block.



##########
lang/c++/impl/BinaryDecoder.cc:
##########


Review Comment:
   This may lead to overflow if `result` is size_t's min value.
   Possible improvement:
   
   ```suggestion
           return static_cast<size_t>(-(result + 1)) + 1;
   ```



##########
lang/c++/test/CodecTests.cc:
##########
@@ -2100,6 +2100,42 @@ static void testJsonCodecReinit() {
     }
 }
 
+static void testArrayNegativeBlockCount() {
+    // Array of ints [10, 20, 30, 40, 50] encoded with a negative block count.
+    // Per the Avro spec, a negative count means: abs(count) items follow,
+    // preceded by a long byte-size of the block.
+    //
+    // Block 1: count=-3, bytesize=3, items: 10, 20, 30
+    // Block 2: count=2, items: 40, 50
+    // Terminal: count=0
+    const uint8_t data[] = {
+        0x05,                    // zigzag(-3) = 5
+        0x06,                    // zigzag(3) = 6  (byte-size of block)
+        0x14, 0x28, 0x3c,       // zigzag ints: 10, 20, 30
+        0x04,                    // zigzag(2) = 4
+        0x50, 0x64,             // zigzag ints: 40, 50
+        0x00                     // terminal
+    };
+
+    InputStreamPtr is = memoryInputStream(data, sizeof(data));
+    DecoderPtr d = binaryDecoder();
+    d->init(*is);
+
+    std::vector<int32_t> result;
+    for (size_t n = d->arrayStart(); n != 0; n = d->arrayNext()) {
+        for (size_t i = 0; i < n; ++i) {
+            result.push_back(d->decodeInt());
+        }
+    }
+
+    BOOST_CHECK_EQUAL(result.size(), 5u);
+    BOOST_CHECK_EQUAL(result[0], 10);
+    BOOST_CHECK_EQUAL(result[1], 20);
+    BOOST_CHECK_EQUAL(result[2], 30);
+    BOOST_CHECK_EQUAL(result[3], 40);
+    BOOST_CHECK_EQUAL(result[4], 50);

Review Comment:
   ```suggestion
       const std::vector<int32_t> expected = {10, 20, 30, 40, 50};
       BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), 
expected.begin(), expected.end());
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to