Call to virtual method ... during construction bypasses virtual dispatch (scan-build / clang analyzer)

This commit is contained in:
folkert van heusden 2024-04-28 01:51:26 +02:00
parent a28b575fb7
commit 6d7f3d9512
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
14 changed files with 55 additions and 12 deletions

View file

@ -305,13 +305,19 @@ void setup() {
cnsl = new console_esp32(&stop_event, serial_ports, 80, 25); cnsl = new console_esp32(&stop_event, serial_ports, 80, 25);
#endif #endif
cnsl->set_bus(b); cnsl->set_bus(b);
cnsl->begin();
running = cnsl->get_running_flag(); running = cnsl->get_running_flag();
Serial.println(F("Connect RK05 and RL02 to BUS")); Serial.println(F("Connect RK05 and RL02 devices to BUS"));
b->add_rk05(new rk05(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag())); auto rk05_dev = new rk05(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag());
rk05_dev->begin();
b->add_rk05(rk05_dev);
auto rl02_dev = new rl02(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag());
rl02_dev->begin();
b->add_rl02(rl02_dev);
b->add_rl02(new rl02(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag()));
Serial.println(F("Init TTY")); Serial.println(F("Init TTY"));
tty_ = new tty(cnsl, b); tty_ = new tty(cnsl, b);

View file

@ -24,6 +24,7 @@
bus::bus() bus::bus()
{ {
mmu_ = new mmu(); mmu_ = new mmu();
mmu_->begin();
kw11_l_ = new kw11_l(this); kw11_l_ = new kw11_l(this);

View file

@ -46,6 +46,10 @@ console::~console()
delete [] screen_buffer; delete [] screen_buffer;
} }
void console::begin()
{
}
void console::start_thread() void console::start_thread()
{ {
assert(b); assert(b);

View file

@ -61,6 +61,8 @@ public:
console(std::atomic_uint32_t *const stop_event, const int t_width = 80, const int t_height = 25); console(std::atomic_uint32_t *const stop_event, const int t_width = 80, const int t_height = 25);
virtual ~console(); virtual ~console();
virtual void begin();
void set_bus(bus *const b) { this->b = b; } void set_bus(bus *const b) { this->b = b; }
void start_thread(); void start_thread();

View file

@ -16,10 +16,6 @@
console_ncurses::console_ncurses(std::atomic_uint32_t *const stop_event): console(stop_event) console_ncurses::console_ncurses(std::atomic_uint32_t *const stop_event): console(stop_event)
{ {
init_ncurses(true); init_ncurses(true);
resize_terminal();
th_panel = new std::thread(&console_ncurses::panel_update_thread, this);
} }
console_ncurses::~console_ncurses() console_ncurses::~console_ncurses()
@ -51,6 +47,13 @@ console_ncurses::~console_ncurses()
endwin(); endwin();
} }
void console_ncurses::begin()
{
resize_terminal();
th_panel = new std::thread(&console_ncurses::panel_update_thread, this);
}
int console_ncurses::wait_for_char_ll(const short timeout) int console_ncurses::wait_for_char_ll(const short timeout)
{ {
struct pollfd fds[] = { { STDIN_FILENO, POLLIN, 0 } }; struct pollfd fds[] = { { STDIN_FILENO, POLLIN, 0 } };

View file

@ -32,6 +32,8 @@ public:
console_ncurses(std::atomic_uint32_t *const stop_event); console_ncurses(std::atomic_uint32_t *const stop_event);
virtual ~console_ncurses(); virtual ~console_ncurses();
void begin() override;
void put_string_lf(const std::string & what) override; void put_string_lf(const std::string & what) override;
void resize_terminal() override; void resize_terminal() override;

View file

@ -18,5 +18,7 @@ public:
virtual ~disk_device() { virtual ~disk_device() {
} }
virtual void begin() = 0;
std::vector<disk_backend *> * access_disk_backends() { return &fhs; } std::vector<disk_backend *> * access_disk_backends() { return &fhs; }
}; };

View file

@ -534,9 +534,13 @@ int main(int argc, char *argv[])
if (enable_bootloader) if (enable_bootloader)
set_boot_loader(b, bootloader); set_boot_loader(b, bootloader);
b->add_rk05(new rk05(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag())); auto rk05_dev = new rk05(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag());
rk05_dev->begin();
b->add_rk05(rk05_dev);
b->add_rl02(new rl02(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag())); auto rl02_dev = new rl02(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag());
rl02_dev->begin();
b->add_rl02(rl02_dev);
} }
else { else {
FILE *fh = fopen(deserialize.c_str(), "r"); FILE *fh = fopen(deserialize.c_str(), "r");
@ -566,6 +570,7 @@ int main(int argc, char *argv[])
} }
cnsl->set_bus(b); cnsl->set_bus(b);
cnsl->begin();
running = cnsl->get_running_flag(); running = cnsl->get_running_flag();

View file

@ -9,13 +9,17 @@
mmu::mmu() mmu::mmu()
{ {
reset();
} }
mmu::~mmu() mmu::~mmu()
{ {
} }
void mmu::begin()
{
reset();
}
void mmu::reset() void mmu::reset()
{ {
memset(pages, 0x00, sizeof pages); memset(pages, 0x00, sizeof pages);
@ -265,6 +269,7 @@ void mmu::set_par_pdr(const json_t *const j_in, const int run_mode, const bool i
mmu *mmu::deserialize(const json_t *const j) mmu *mmu::deserialize(const json_t *const j)
{ {
mmu *m = new mmu(); mmu *m = new mmu();
m->begin();
for(int run_mode=0; run_mode<4; run_mode++) { for(int run_mode=0; run_mode<4; run_mode++) {
if (run_mode == 2) if (run_mode == 2)

2
mmu.h
View file

@ -50,6 +50,8 @@ public:
mmu(); mmu();
virtual ~mmu(); virtual ~mmu();
void begin();
#if IS_POSIX #if IS_POSIX
json_t *serialize() const; json_t *serialize() const;
static mmu *deserialize(const json_t *const j); static mmu *deserialize(const json_t *const j);

View file

@ -28,7 +28,6 @@ rk05::rk05(bus *const b, std::atomic_bool *const disk_read_acitivity, std::atomi
disk_read_acitivity(disk_read_acitivity), disk_read_acitivity(disk_read_acitivity),
disk_write_acitivity(disk_write_acitivity) disk_write_acitivity(disk_write_acitivity)
{ {
reset();
} }
rk05::~rk05() rk05::~rk05()
@ -37,6 +36,11 @@ rk05::~rk05()
delete fh; delete fh;
} }
void rk05::begin()
{
reset();
}
void rk05::reset() void rk05::reset()
{ {
memset(registers, 0x00, sizeof registers); memset(registers, 0x00, sizeof registers);

1
rk05.h
View file

@ -42,6 +42,7 @@ public:
rk05(bus *const b, std::atomic_bool *const disk_read_acitivity, std::atomic_bool *const disk_write_acitivity); rk05(bus *const b, std::atomic_bool *const disk_read_acitivity, std::atomic_bool *const disk_write_acitivity);
virtual ~rk05(); virtual ~rk05();
void begin() override;
void reset() override; void reset() override;
uint8_t readByte(const uint16_t addr) override; uint8_t readByte(const uint16_t addr) override;

View file

@ -36,7 +36,6 @@ rl02::rl02(bus *const b, std::atomic_bool *const disk_read_activity, std::atomic
disk_read_activity (disk_read_activity ), disk_read_activity (disk_read_activity ),
disk_write_activity(disk_write_activity) disk_write_activity(disk_write_activity)
{ {
reset();
} }
rl02::~rl02() rl02::~rl02()
@ -45,6 +44,11 @@ rl02::~rl02()
delete fh; delete fh;
} }
void rl02::begin()
{
reset();
}
void rl02::reset() void rl02::reset()
{ {
memset(registers, 0x00, sizeof registers ); memset(registers, 0x00, sizeof registers );
@ -85,6 +89,7 @@ rl02 *rl02::deserialize(const json_t *const j, bus *const b)
std::vector<disk_backend *> backends; std::vector<disk_backend *> backends;
rl02 *r = new rl02(b, nullptr, nullptr); rl02 *r = new rl02(b, nullptr, nullptr);
r->begin();
json_t *j_backends = json_object_get(j, "backends"); json_t *j_backends = json_object_get(j, "backends");
for(size_t i=0; i<json_array_size(j_backends); i++) for(size_t i=0; i<json_array_size(j_backends); i++)

1
rl02.h
View file

@ -50,6 +50,7 @@ public:
rl02(bus *const b, std::atomic_bool *const disk_read_activity, std::atomic_bool *const disk_write_activity); rl02(bus *const b, std::atomic_bool *const disk_read_activity, std::atomic_bool *const disk_write_activity);
virtual ~rl02(); virtual ~rl02();
void begin() override;
void reset() override; void reset() override;
#if IS_POSIX #if IS_POSIX