From edbc60a3fb9b0a22808b569a97a0439f0b21135c Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 17 Oct 2017 20:50:46 -0400 Subject: [PATCH] Various undefined behaviour fixes. Primarily around uninitialised variables, but also with an attempted use of a negative pointer. --- Machines/AmstradCPC/AmstradCPC.cpp | 30 ++++++++---------------- Outputs/CRT/Internals/ArrayBuilder.cpp | 4 +--- Outputs/CRT/Internals/ArrayBuilder.hpp | 12 +++++----- Outputs/CRT/Internals/TextureBuilder.cpp | 10 ++++---- 4 files changed, 22 insertions(+), 34 deletions(-) diff --git a/Machines/AmstradCPC/AmstradCPC.cpp b/Machines/AmstradCPC/AmstradCPC.cpp index 4c04db4c4..78486a1d8 100644 --- a/Machines/AmstradCPC/AmstradCPC.cpp +++ b/Machines/AmstradCPC/AmstradCPC.cpp @@ -155,18 +155,8 @@ class AYDeferrer { class CRTCBusHandler { public: CRTCBusHandler(uint8_t *ram, InterruptTimer &interrupt_timer) : - cycles_(0), - was_enabled_(false), - was_sync_(false), - pixel_data_(nullptr), - pixel_pointer_(nullptr), - was_hsync_(false), ram_(ram), - interrupt_timer_(interrupt_timer), - pixel_divider_(1), - mode_(2), - next_mode_(2), - cycles_into_hsync_(0) { + interrupt_timer_(interrupt_timer) { establish_palette_hits(); build_mode_table(); } @@ -500,19 +490,19 @@ class CRTCBusHandler { return mapping[colour]; } - unsigned int cycles_; + unsigned int cycles_ = 0; - bool was_enabled_, was_sync_, was_hsync_, was_vsync_; - int cycles_into_hsync_; + bool was_enabled_ = false, was_sync_ = false, was_hsync_ = false, was_vsync_ = false; + int cycles_into_hsync_ = 0; std::shared_ptr crt_; - uint8_t *pixel_data_, *pixel_pointer_; + uint8_t *pixel_data_ = nullptr, *pixel_pointer_ = nullptr; - uint8_t *ram_; + uint8_t *ram_ = nullptr; - int next_mode_, mode_; + int next_mode_ = 2, mode_ = 2; - unsigned int pixel_divider_; + unsigned int pixel_divider_ = 1; uint16_t mode0_output_[256]; uint32_t mode1_output_[256]; uint64_t mode2_output_[256]; @@ -522,9 +512,9 @@ class CRTCBusHandler { std::vector mode1_palette_hits_[4]; std::vector mode3_palette_hits_[4]; - int pen_; + int pen_ = 0; uint8_t palette_[16]; - uint8_t border_; + uint8_t border_ = 0; InterruptTimer &interrupt_timer_; }; diff --git a/Outputs/CRT/Internals/ArrayBuilder.cpp b/Outputs/CRT/Internals/ArrayBuilder.cpp index 26216834c..1f09602f5 100644 --- a/Outputs/CRT/Internals/ArrayBuilder.cpp +++ b/Outputs/CRT/Internals/ArrayBuilder.cpp @@ -67,9 +67,7 @@ ArrayBuilder::Submission ArrayBuilder::submit() { } ArrayBuilder::Buffer::Buffer(size_t size, std::function submission_function) : - is_full(false), - submission_function_(submission_function), - allocated_data(0), flushed_data(0), submitted_data(0) { + submission_function_(submission_function) { if(!submission_function_) { glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); diff --git a/Outputs/CRT/Internals/ArrayBuilder.hpp b/Outputs/CRT/Internals/ArrayBuilder.hpp index 1c02e5e68..adaf384ae 100644 --- a/Outputs/CRT/Internals/ArrayBuilder.hpp +++ b/Outputs/CRT/Internals/ArrayBuilder.hpp @@ -82,17 +82,17 @@ class ArrayBuilder { void reset(); private: - bool is_full; - GLuint buffer; + bool is_full = false; + GLuint buffer = 0; std::function submission_function_; std::vector data; - size_t allocated_data; - size_t flushed_data; - size_t submitted_data; + size_t allocated_data = 0; + size_t flushed_data = 0; + size_t submitted_data = 0; } output_, input_; uint8_t *get_storage(size_t size, Buffer &buffer); - bool is_full_; + bool is_full_ = false; }; } diff --git a/Outputs/CRT/Internals/TextureBuilder.cpp b/Outputs/CRT/Internals/TextureBuilder.cpp index 7fa46d955..945b440b1 100644 --- a/Outputs/CRT/Internals/TextureBuilder.cpp +++ b/Outputs/CRT/Internals/TextureBuilder.cpp @@ -99,13 +99,13 @@ void TextureBuilder::reduce_previous_allocation_to(size_t actual_length) { // against rounding errors when this run is drawn. // TODO: allow somebody else to specify the rule for generating a left-padding value and // a right-padding value. - uint8_t *start_pointer = pointer_to_location(write_area_.x, write_area_.y); - memcpy( &start_pointer[-bytes_per_pixel_], - start_pointer, + uint8_t *start_pointer = pointer_to_location(write_area_.x, write_area_.y) - bytes_per_pixel_; + memcpy( start_pointer, + &start_pointer[bytes_per_pixel_], bytes_per_pixel_); - memcpy( &start_pointer[actual_length * bytes_per_pixel_], - &start_pointer[(actual_length - 1) * bytes_per_pixel_], + memcpy( &start_pointer[(actual_length + 1) * bytes_per_pixel_], + &start_pointer[actual_length * bytes_per_pixel_], bytes_per_pixel_); }