Skip to content

Commit

Permalink
Fix encode zero bits on word boundary bug
Browse files Browse the repository at this point in the history
Bit stream writer was manifesting incorrect behaviour when the following
two conditions were met:
- writer was on 64-bit word boundary
- WriteBits was invoked with num_bits=0 (can happen when a Huffman codec has only one
value)

The bug was causing very rare sporadic corruption which was detected by
tests after a random experimental change in MARK-V model.
  • Loading branch information
Andrey Tuganov committed Aug 28, 2017
1 parent 63e1e34 commit d41a524
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 0 deletions.
2 changes: 2 additions & 0 deletions source/util/bit_stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,8 @@ void BitWriterWord64::WriteBits(uint64_t bits, size_t num_bits) {
assert(is_little_endian && "Big-endian architecture support not implemented");
if (!is_little_endian) return;

if (num_bits == 0) return;

bits = GetLowerBits(bits, num_bits);

EmitSequence(bits, num_bits);
Expand Down
19 changes: 19 additions & 0 deletions test/bit_stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,25 @@ TEST(BitWriterWord64, WriteBits) {
EXPECT_EQ(PadToWord<64>("110011100111001"), writer.GetStreamPadded64());
}

TEST(BitWriterWord64, WriteZeroBits) {
BitWriterWord64 writer;
writer.WriteBits(0, 0);
writer.WriteBits(1, 0);
EXPECT_EQ(0u, writer.GetNumBits());
writer.WriteBits(1, 1);
writer.WriteBits(0, 0);
EXPECT_EQ(PadToWord<64>("1"), writer.GetStreamPadded64());
writer.WriteBits(0, 63);
EXPECT_EQ(64u, writer.GetNumBits());
writer.WriteBits(0, 0);
writer.WriteBits(7, 3);
writer.WriteBits(0, 0);
EXPECT_EQ(PadToWord<64>(
"1"
"000000000000000000000000000000000000000000000000000000000000000"
"111"), writer.GetStreamPadded64());
}

TEST(BitWriterWord64, ComparisonTestWriteLotsOfBits) {
BitWriterStringStream writer1;
BitWriterWord64 writer2(16384);
Expand Down

0 comments on commit d41a524

Please sign in to comment.