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);
#endif
cnsl->set_bus(b);
cnsl->begin();
running = cnsl->get_running_flag();
Serial.println(F("Connect RK05 and RL02 to BUS"));
b->add_rk05(new rk05(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag()));
Serial.println(F("Connect RK05 and RL02 devices to BUS"));
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"));
tty_ = new tty(cnsl, b);

View file

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

View file

@ -46,6 +46,10 @@ console::~console()
delete [] screen_buffer;
}
void console::begin()
{
}
void console::start_thread()
{
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);
virtual ~console();
virtual void begin();
void set_bus(bus *const b) { this->b = b; }
void start_thread();

View file

@ -16,10 +16,6 @@
console_ncurses::console_ncurses(std::atomic_uint32_t *const stop_event): console(stop_event)
{
init_ncurses(true);
resize_terminal();
th_panel = new std::thread(&console_ncurses::panel_update_thread, this);
}
console_ncurses::~console_ncurses()
@ -51,6 +47,13 @@ console_ncurses::~console_ncurses()
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)
{
struct pollfd fds[] = { { STDIN_FILENO, POLLIN, 0 } };

View file

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

View file

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

View file

@ -534,9 +534,13 @@ int main(int argc, char *argv[])
if (enable_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 {
FILE *fh = fopen(deserialize.c_str(), "r");
@ -566,6 +570,7 @@ int main(int argc, char *argv[])
}
cnsl->set_bus(b);
cnsl->begin();
running = cnsl->get_running_flag();

View file

@ -9,13 +9,17 @@
mmu::mmu()
{
reset();
}
mmu::~mmu()
{
}
void mmu::begin()
{
reset();
}
void mmu::reset()
{
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 *m = new mmu();
m->begin();
for(int run_mode=0; run_mode<4; run_mode++) {
if (run_mode == 2)

2
mmu.h
View file

@ -50,6 +50,8 @@ public:
mmu();
virtual ~mmu();
void begin();
#if IS_POSIX
json_t *serialize() const;
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_write_acitivity(disk_write_acitivity)
{
reset();
}
rk05::~rk05()
@ -37,6 +36,11 @@ rk05::~rk05()
delete fh;
}
void rk05::begin()
{
reset();
}
void rk05::reset()
{
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);
virtual ~rk05();
void begin() override;
void reset() 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_write_activity(disk_write_activity)
{
reset();
}
rl02::~rl02()
@ -45,6 +44,11 @@ rl02::~rl02()
delete fh;
}
void rl02::begin()
{
reset();
}
void rl02::reset()
{
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;
rl02 *r = new rl02(b, nullptr, nullptr);
r->begin();
json_t *j_backends = json_object_get(j, "backends");
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);
virtual ~rl02();
void begin() override;
void reset() override;
#if IS_POSIX