Internals: Fix up include/ cppcheck issues (#6311)

This commit is contained in:
Wilson Snyder 2025-08-19 21:36:52 -04:00
parent d1f71f2342
commit f71b8e6195
17 changed files with 69 additions and 48 deletions

View File

@ -392,7 +392,6 @@ install-msg:
###################################################################### ######################################################################
# Format/Lint # Format/Lint
# Use --xml flag to see the cppcheck code to use for suppression
CPPCHECK1_CPP = $(wildcard $(srcdir)/include/*.cpp) CPPCHECK1_CPP = $(wildcard $(srcdir)/include/*.cpp)
CPPCHECK2_CPP = $(wildcard $(srcdir)/examples/*/*.cpp) CPPCHECK2_CPP = $(wildcard $(srcdir)/examples/*/*.cpp)
CPPCHECK3_CPP = $(wildcard $(srcdir)/src/Vlc*.cpp) CPPCHECK3_CPP = $(wildcard $(srcdir)/src/Vlc*.cpp)
@ -422,8 +421,9 @@ CPPCHECK_INC += -I$(srcdir)/include/vltstd
CPPCHECK_INC += -I$(srcdir)/src/obj_dbg CPPCHECK_INC += -I$(srcdir)/src/obj_dbg
CPPCHECK_INC += -I$(srcdir)/src CPPCHECK_INC += -I$(srcdir)/src
$(CPPCHECK_CACHE): $(CPPCHECK_CACHE): $(CHECK_CPP) $(CHECK_H) $(CHECK_YL)
mkdir -p $@ /bin/rm -rf $@
/bin/mkdir -p $@
cppcheck: cppcheck-1 cppcheck-2 cppcheck-3 cppcheck-4 cppcheck-5 cppcheck-6 cppcheck-7 cppcheck-8 cppcheck: cppcheck-1 cppcheck-2 cppcheck-3 cppcheck-4 cppcheck-5 cppcheck-6 cppcheck-7 cppcheck-8
cppcheck-1: | $(CPPCHECK_CACHE) cppcheck-1: | $(CPPCHECK_CACHE)

View File

@ -627,11 +627,9 @@ WDataOutP VL_POW_WWW(int obits, int, int rbits, WDataOutP owp, const WDataInP lw
VL_DEBUG_IFDEF(assert(owords <= VL_MULS_MAX_WORDS);); VL_DEBUG_IFDEF(assert(owords <= VL_MULS_MAX_WORDS););
owp[0] = 1; owp[0] = 1;
for (int i = 1; i < VL_WORDS_I(obits); ++i) owp[i] = 0; for (int i = 1; i < VL_WORDS_I(obits); ++i) owp[i] = 0;
// cppcheck-has-bug-suppress variableScope
VlWide<VL_MULS_MAX_WORDS> powstore; // Fixed size, as MSVC++ doesn't allow [words] here VlWide<VL_MULS_MAX_WORDS> powstore; // Fixed size, as MSVC++ doesn't allow [words] here
VlWide<VL_MULS_MAX_WORDS> lastpowstore; // Fixed size, as MSVC++ doesn't allow [words] here VlWide<VL_MULS_MAX_WORDS> lastpowstore; // Fixed size, as MSVC++ doesn't allow [words] here
VlWide<VL_MULS_MAX_WORDS> lastoutstore; // Fixed size, as MSVC++ doesn't allow [words] here VlWide<VL_MULS_MAX_WORDS> lastoutstore; // Fixed size, as MSVC++ doesn't allow [words] here
// cppcheck-has-bug-suppress variableScope
VL_ASSIGN_W(obits, powstore, lwp); VL_ASSIGN_W(obits, powstore, lwp);
for (int bit = 0; bit < rbits; ++bit) { for (int bit = 0; bit < rbits; ++bit) {
if (bit > 0) { // power = power*power if (bit > 0) { // power = power*power
@ -1384,7 +1382,6 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf
_vl_vsss_skipspace(fp, floc, fromp, fstr); _vl_vsss_skipspace(fp, floc, fromp, fstr);
_vl_vsss_read_str(fp, floc, fromp, fstr, t_tmp, "+-.0123456789eE"); _vl_vsss_read_str(fp, floc, fromp, fstr, t_tmp, "+-.0123456789eE");
if (!t_tmp[0]) goto done; if (!t_tmp[0]) goto done;
// cppcheck-has-bug-suppress unusedStructMember, unreadVariable
union { union {
double r; double r;
int64_t ld; int64_t ld;
@ -2151,7 +2148,6 @@ VlReadMem::VlReadMem(bool hex, int bits, const std::string& filename, QData star
if (VL_UNLIKELY(!m_fp)) { if (VL_UNLIKELY(!m_fp)) {
// We don't report the Verilog source filename as it slow to have to pass it down // We don't report the Verilog source filename as it slow to have to pass it down
VL_WARN_MT(filename.c_str(), 0, "", "$readmem file not found"); VL_WARN_MT(filename.c_str(), 0, "", "$readmem file not found");
// cppcheck-has-bug-suppress resourceLeak // m_fp is nullptr
return; return;
} }
} }
@ -2291,7 +2287,6 @@ VlWriteMem::VlWriteMem(bool hex, int bits, const std::string& filename, QData st
m_fp = std::fopen(filename.c_str(), "w"); m_fp = std::fopen(filename.c_str(), "w");
if (VL_UNLIKELY(!m_fp)) { if (VL_UNLIKELY(!m_fp)) {
VL_FATAL_MT(filename.c_str(), 0, "", "$writemem file not found"); VL_FATAL_MT(filename.c_str(), 0, "", "$writemem file not found");
// cppcheck-has-bug-suppress resourceLeak // m_fp is nullptr
return; return;
} }
} }
@ -2475,7 +2470,6 @@ static const char* vl_time_str(int scale) VL_PURE {
double vl_time_multiplier(int scale) VL_PURE { double vl_time_multiplier(int scale) VL_PURE {
// Return timescale multiplier -18 to +18 // Return timescale multiplier -18 to +18
// For speed, this does not check for illegal values // For speed, this does not check for illegal values
// cppcheck-has-bug-suppress arrayIndexOutOfBoundsCond
if (scale < 0) { if (scale < 0) {
static const double neg10[] = {1.0, static const double neg10[] = {1.0,
0.1, 0.1,
@ -2496,7 +2490,6 @@ double vl_time_multiplier(int scale) VL_PURE {
0.0000000000000001, 0.0000000000000001,
0.00000000000000001, 0.00000000000000001,
0.000000000000000001}; 0.000000000000000001};
// cppcheck-has-bug-suppress arrayIndexOutOfBoundsCond
return neg10[-scale]; return neg10[-scale];
} else { } else {
static const double pow10[] = {1.0, static const double pow10[] = {1.0,
@ -2518,7 +2511,6 @@ double vl_time_multiplier(int scale) VL_PURE {
10000000000000000.0, 10000000000000000.0,
100000000000000000.0, 100000000000000000.0,
1000000000000000000.0}; 1000000000000000000.0};
// cppcheck-has-bug-suppress arrayIndexOutOfBoundsCond
return pow10[scale]; return pow10[scale];
} }
} }
@ -2814,7 +2806,7 @@ void VerilatedContext::internalsDump() const VL_MT_SAFE {
VerilatedImp::userDump(); VerilatedImp::userDump();
} }
void VerilatedContext::addModel(VerilatedModel* modelp) { void VerilatedContext::addModel(const VerilatedModel* modelp) {
if (!quiet()) { if (!quiet()) {
// CPU time isn't read as starting point until model creation, so that quiet() is set // CPU time isn't read as starting point until model creation, so that quiet() is set
// Thus if quiet(), avoids slow OS read affecting some usages that make many models // Thus if quiet(), avoids slow OS read affecting some usages that make many models
@ -2852,7 +2844,7 @@ VerilatedVirtualBase* VerilatedContext::threadPoolp() {
void VerilatedContext::prepareClone() { delete m_threadPool.release(); } void VerilatedContext::prepareClone() { delete m_threadPool.release(); }
VerilatedVirtualBase* VerilatedContext::threadPoolpOnClone() { VerilatedVirtualBase* VerilatedContext::threadPoolpOnClone() {
if (VL_UNLIKELY(m_threadPool)) m_threadPool.release(); if (VL_UNLIKELY(m_threadPool)) (void)m_threadPool.release();
m_threadPool = std::unique_ptr<VlThreadPool>(new VlThreadPool{this, m_threads - 1}); m_threadPool = std::unique_ptr<VlThreadPool>(new VlThreadPool{this, m_threads - 1});
return m_threadPool.get(); return m_threadPool.get();
} }
@ -3133,7 +3125,7 @@ void VerilatedContext::trace(VerilatedTraceBaseC* tfp, int levels, int options)
VL_FATAL_MT("", 0, "", VL_FATAL_MT("", 0, "",
"Testbench C call to 'VerilatedContext::trace()' requires model(s) Verilated" "Testbench C call to 'VerilatedContext::trace()' requires model(s) Verilated"
" with --trace-fst or --trace-vcd option"); " with --trace-fst or --trace-vcd option");
for (auto& cbr : m_ns.m_traceBaseModelCbs) cbr(tfp, levels, options); for (const auto& cbr : m_ns.m_traceBaseModelCbs) cbr(tfp, levels, options);
} }
void VerilatedContext::traceBaseModelCbAdd(traceBaseModelCb_t cb) VL_MT_SAFE { void VerilatedContext::traceBaseModelCbAdd(traceBaseModelCb_t cb) VL_MT_SAFE {
// Model creation registering a callback for when Verilated::trace() called // Model creation registering a callback for when Verilated::trace() called
@ -3148,7 +3140,6 @@ VerilatedSyms::VerilatedSyms(VerilatedContext* contextp)
: _vm_contextp__(contextp ? contextp : Verilated::threadContextp()) { : _vm_contextp__(contextp ? contextp : Verilated::threadContextp()) {
VerilatedContext::checkMagic(_vm_contextp__); VerilatedContext::checkMagic(_vm_contextp__);
Verilated::threadContextp(_vm_contextp__); Verilated::threadContextp(_vm_contextp__);
// cppcheck-has-bug-suppress noCopyConstructor
__Vm_evalMsgQp = new VerilatedEvalMsgQueue; __Vm_evalMsgQp = new VerilatedEvalMsgQueue;
} }
@ -3550,16 +3541,16 @@ void VerilatedScope::scopeDump() const {
VerilatedImp::exportName(i)); VerilatedImp::exportName(i));
} }
} }
if (const VerilatedVarNameMap* const varsp = this->varsp()) { if (const VerilatedVarNameMap* const ivarsp = this->varsp()) {
for (const auto& i : *varsp) VL_PRINTF_MT(" VAR %p: %s\n", &(i.second), i.first); for (const auto& i : *ivarsp) VL_PRINTF_MT(" VAR %p: %s\n", &(i.second), i.first);
} }
} }
void VerilatedHierarchy::add(VerilatedScope* fromp, VerilatedScope* top) { void VerilatedHierarchy::add(const VerilatedScope* fromp, const VerilatedScope* top) {
VerilatedImp::hierarchyAdd(fromp, top); VerilatedImp::hierarchyAdd(fromp, top);
} }
void VerilatedHierarchy::remove(VerilatedScope* fromp, VerilatedScope* top) { void VerilatedHierarchy::remove(const VerilatedScope* fromp, const VerilatedScope* top) {
VerilatedImp::hierarchyRemove(fromp, top); VerilatedImp::hierarchyRemove(fromp, top);
} }

View File

@ -644,7 +644,7 @@ public:
} }
// Internal: Model and thread setup // Internal: Model and thread setup
void addModel(VerilatedModel*); void addModel(const VerilatedModel* modelp);
VerilatedVirtualBase* threadPoolp(); VerilatedVirtualBase* threadPoolp();
void prepareClone(); void prepareClone();
VerilatedVirtualBase* threadPoolpOnClone(); VerilatedVirtualBase* threadPoolpOnClone();
@ -763,8 +763,8 @@ public: // But internals only - called from VerilatedModule's
class VerilatedHierarchy final { class VerilatedHierarchy final {
public: public:
static void add(VerilatedScope* fromp, VerilatedScope* top); static void add(const VerilatedScope* fromp, const VerilatedScope* top);
static void remove(VerilatedScope* fromp, VerilatedScope* top); static void remove(const VerilatedScope* fromp, const VerilatedScope* top);
}; };
//=========================================================================== //===========================================================================

View File

@ -255,17 +255,21 @@ private:
public: public:
// PUBLIC METHODS // PUBLIC METHODS
// cppcheck-suppress dupInheritedMember
std::string defaultFilename() VL_MT_SAFE { return m_contextp->coverageFilename(); } std::string defaultFilename() VL_MT_SAFE { return m_contextp->coverageFilename(); }
// cppcheck-suppress dupInheritedMember
void forcePerInstance(const bool flag) VL_MT_SAFE_EXCLUDES(m_mutex) { void forcePerInstance(const bool flag) VL_MT_SAFE_EXCLUDES(m_mutex) {
Verilated::quiesce(); Verilated::quiesce();
const VerilatedLockGuard lock{m_mutex}; const VerilatedLockGuard lock{m_mutex};
m_forcePerInstance = flag; m_forcePerInstance = flag;
} }
// cppcheck-suppress dupInheritedMember
void clear() VL_MT_SAFE_EXCLUDES(m_mutex) { void clear() VL_MT_SAFE_EXCLUDES(m_mutex) {
Verilated::quiesce(); Verilated::quiesce();
const VerilatedLockGuard lock{m_mutex}; const VerilatedLockGuard lock{m_mutex};
clearGuts(); clearGuts();
} }
// cppcheck-suppress dupInheritedMember
void clearNonMatch(const char* const matchp) VL_MT_SAFE_EXCLUDES(m_mutex) { void clearNonMatch(const char* const matchp) VL_MT_SAFE_EXCLUDES(m_mutex) {
Verilated::quiesce(); Verilated::quiesce();
const VerilatedLockGuard lock{m_mutex}; const VerilatedLockGuard lock{m_mutex};
@ -281,10 +285,11 @@ public:
m_items = newlist; m_items = newlist;
} }
} }
// cppcheck-suppress dupInheritedMember
void zero() VL_MT_SAFE_EXCLUDES(m_mutex) { void zero() VL_MT_SAFE_EXCLUDES(m_mutex) {
Verilated::quiesce(); Verilated::quiesce();
const VerilatedLockGuard lock{m_mutex}; const VerilatedLockGuard lock{m_mutex};
for (const auto& itemp : m_items) itemp->zero(); for (const VerilatedCovImpItem* const itemp : m_items) itemp->zero();
} }
// We assume there's always call to i/f/p in that order // We assume there's always call to i/f/p in that order
@ -307,6 +312,7 @@ public:
valps[0] = m_insertFilenamep; valps[0] = m_insertFilenamep;
const std::string linestr = std::to_string(m_insertLineno); const std::string linestr = std::to_string(m_insertLineno);
ckeyps[1] = "lineno"; ckeyps[1] = "lineno";
// cppcheck-suppress autoVariables // Used only below for insert
valps[1] = linestr.c_str(); valps[1] = linestr.c_str();
// Default page if not specified // Default page if not specified
const char* fnstartp = m_insertFilenamep; const char* fnstartp = m_insertFilenamep;
@ -316,6 +322,7 @@ public:
const size_t page_len = fnendp - fnstartp; const size_t page_len = fnendp - fnstartp;
const std::string page_default = "sp_user/" + std::string{fnstartp, page_len}; const std::string page_default = "sp_user/" + std::string{fnstartp, page_len};
ckeyps[2] = "page"; ckeyps[2] = "page";
// cppcheck-suppress autoVariables // Used only below for insert
valps[2] = page_default.c_str(); valps[2] = page_default.c_str();
// Keys -> strings // Keys -> strings
@ -357,6 +364,7 @@ public:
m_insertp = nullptr; m_insertp = nullptr;
} }
// cppcheck-suppress dupInheritedMember
void write(const std::string& filename) VL_MT_SAFE_EXCLUDES(m_mutex) { void write(const std::string& filename) VL_MT_SAFE_EXCLUDES(m_mutex) {
Verilated::quiesce(); Verilated::quiesce();
const VerilatedLockGuard lock{m_mutex}; const VerilatedLockGuard lock{m_mutex};

View File

@ -290,7 +290,7 @@ static void _vl_svGetBitArrElemVecVal(svBitVecVal* d, const svOpenArrayHandle s,
break; break;
} }
case VLVT_WDATA: { case VLVT_WDATA: {
WDataOutP wdatap = (reinterpret_cast<WDataOutP>(datap)); WDataInP wdatap = (reinterpret_cast<WDataInP>(datap));
for (int i = 0; i < VL_WORDS_I(varp->entBits()); ++i) d[i] = wdatap[i]; for (int i = 0; i < VL_WORDS_I(varp->entBits()); ++i) d[i] = wdatap[i];
return; return;
} }
@ -329,7 +329,7 @@ static void _vl_svGetLogicArrElemVecVal(svLogicVecVal* d, const svOpenArrayHandl
break; break;
} }
case VLVT_WDATA: { case VLVT_WDATA: {
WDataOutP wdatap = (reinterpret_cast<WDataOutP>(datap)); WDataInP wdatap = (reinterpret_cast<WDataInP>(datap));
for (int i = 0; i < VL_WORDS_I(varp->entBits()); ++i) { for (int i = 0; i < VL_WORDS_I(varp->entBits()); ++i) {
d[i].aval = wdatap[i]; d[i].aval = wdatap[i];
d[i].bval = 0; d[i].bval = 0;

View File

@ -297,7 +297,7 @@ VerilatedFst::Buffer* VerilatedFst::getTraceBuffer(uint32_t fidx) {
void VerilatedFst::commitTraceBuffer(VerilatedFst::Buffer* bufp) { void VerilatedFst::commitTraceBuffer(VerilatedFst::Buffer* bufp) {
if (offload()) { if (offload()) {
OffloadBuffer* const offloadBufferp = static_cast<OffloadBuffer*>(bufp); const OffloadBuffer* const offloadBufferp = static_cast<const OffloadBuffer*>(bufp);
if (offloadBufferp->m_offloadBufferWritep) { if (offloadBufferp->m_offloadBufferWritep) {
m_offloadBufferWritep = offloadBufferp->m_offloadBufferWritep; m_offloadBufferWritep = offloadBufferp->m_offloadBufferWritep;
return; // Buffer will be deleted by the offload thread return; // Buffer will be deleted by the offload thread

View File

@ -652,7 +652,7 @@ static inline IData VL_REDAND_IW(int lbits, WDataInP const lwp) VL_PURE {
EData combine = lwp[0]; EData combine = lwp[0];
for (int i = 1; i < words - 1; ++i) combine &= lwp[i]; for (int i = 1; i < words - 1; ++i) combine &= lwp[i];
combine &= ~VL_MASK_E(lbits) | lwp[words - 1]; combine &= ~VL_MASK_E(lbits) | lwp[words - 1];
// cppcheck-has-bug-suppress knownConditionTrueFalse // cppcheck-suppress knownConditionTrueFalse
return ((~combine) == 0); return ((~combine) == 0);
} }
@ -1094,14 +1094,12 @@ static inline WDataOutP VL_MULS_WWW(int lbits, WDataOutP owp, WDataInP const lwp
if (lneg) { // Negate lhs if (lneg) { // Negate lhs
lwusp = lwstore; lwusp = lwstore;
VL_NEGATE_W(words, lwstore, lwp); VL_NEGATE_W(words, lwstore, lwp);
// cppcheck-has-bug-suppress unreadVariable
lwstore[words - 1] &= VL_MASK_E(lbits); // Clean it lwstore[words - 1] &= VL_MASK_E(lbits); // Clean it
} }
const EData rneg = VL_SIGN_E(lbits, rwp[words - 1]); const EData rneg = VL_SIGN_E(lbits, rwp[words - 1]);
if (rneg) { // Negate rhs if (rneg) { // Negate rhs
rwusp = rwstore; rwusp = rwstore;
VL_NEGATE_W(words, rwstore, rwp); VL_NEGATE_W(words, rwstore, rwp);
// cppcheck-has-bug-suppress unreadVariable
rwstore[words - 1] &= VL_MASK_E(lbits); // Clean it rwstore[words - 1] &= VL_MASK_E(lbits); // Clean it
} }
VL_MUL_W(words, owp, lwusp, rwusp); VL_MUL_W(words, owp, lwusp, rwusp);
@ -2760,6 +2758,7 @@ static inline void VL_SELASSIGN_WW(int rbits, int obits, WDataOutP iowp, WDataIn
const int w = obits < upperbits ? obits : upperbits; const int w = obits < upperbits ? obits : upperbits;
const int insmask = VL_MASK_E(w); const int insmask = VL_MASK_E(w);
iowp[0] = (iowp[0] & ~insmask) | ((rwp[wordoff] >> lsb) & insmask); iowp[0] = (iowp[0] & ~insmask) | ((rwp[wordoff] >> lsb) & insmask);
// cppcheck-suppress knownConditionTrueFalse
if (w == obits) return; if (w == obits) return;
obits -= w; obits -= w;
} }

View File

@ -363,7 +363,7 @@ private:
VerilatedFpList fdToFpList(IData fdi) VL_REQUIRES(m_fdMutex) { VerilatedFpList fdToFpList(IData fdi) VL_REQUIRES(m_fdMutex) {
VerilatedFpList fp; VerilatedFpList fp;
// cppverilator-suppress integerOverflow shiftTooManyBitsSigned // cppverilator-suppress integerOverflow shiftTooManyBitsSigned
if ((fdi & (1 << 31)) != 0) { if (VL_BITISSET_I(fdi, 31)) {
// Non-MCD case // Non-MCD case
const IData idx = fdi & VL_MASK_I(31); const IData idx = fdi & VL_MASK_I(31);
switch (idx) { switch (idx) {

View File

@ -145,7 +145,7 @@ void VlExecutionProfiler::dump(const char* filenamep, uint64_t tickEnd)
fprintf(fp, "VLPROF arg +verilator+prof+exec+window+%u\n", fprintf(fp, "VLPROF arg +verilator+prof+exec+window+%u\n",
Verilated::threadContextp()->profExecWindow()); Verilated::threadContextp()->profExecWindow());
std::string numa = "no threads"; std::string numa = "no threads";
if (VlThreadPool* const threadPoolp if (const VlThreadPool* const threadPoolp
= static_cast<VlThreadPool*>(Verilated::threadContextp()->threadPoolp())) { = static_cast<VlThreadPool*>(Verilated::threadContextp()->threadPoolp())) {
numa = threadPoolp->numaStatus(); numa = threadPoolp->numaStatus();
} }

View File

@ -455,8 +455,8 @@ bool VlRandomizer::parseSolution(std::iostream& f) {
const auto it = m_vars.find(name); const auto it = m_vars.find(name);
if (it == m_vars.end()) continue; if (it == m_vars.end()) continue;
const VlRandomVar& varr = *it->second; const VlRandomVar& varr = *it->second;
if (m_randmode && !varr.randModeIdxNone()) { if (m_randmodep && !varr.randModeIdxNone()) {
if (!(m_randmode->at(varr.randModeIdx()))) continue; if (!m_randmodep->at(varr.randModeIdx())) continue;
} }
if (!indices.empty()) { if (!indices.empty()) {
std::ostringstream oss; std::ostringstream oss;

View File

@ -200,7 +200,7 @@ class VlRandomizer final {
std::map<std::string, std::shared_ptr<const VlRandomVar>> m_vars; // Solver-dependent std::map<std::string, std::shared_ptr<const VlRandomVar>> m_vars; // Solver-dependent
// variables // variables
ArrayInfoMap m_arr_vars; // Tracks each element in array structures for iteration ArrayInfoMap m_arr_vars; // Tracks each element in array structures for iteration
const VlQueue<CData>* m_randmode; // rand_mode state; const VlQueue<CData>* m_randmodep = nullptr; // rand_mode state;
int m_index = 0; // Internal counter for key generation int m_index = 0; // Internal counter for key generation
// PRIVATE METHODS // PRIVATE METHODS
@ -574,7 +574,7 @@ public:
void hard(std::string&& constraint); void hard(std::string&& constraint);
void clear(); void clear();
void set_randmode(const VlQueue<CData>& randmode) { m_randmode = &randmode; } void set_randmode(const VlQueue<CData>& randmode) { m_randmodep = &randmode; }
#ifdef VL_DEBUG #ifdef VL_DEBUG
void dump() const; void dump() const;
#endif #endif

View File

@ -220,7 +220,7 @@ void VerilatedRestore::fill() VL_MT_UNSAFE_ONE {
if (VL_UNLIKELY(!isOpen())) return; if (VL_UNLIKELY(!isOpen())) return;
// Move remaining characters down to start of buffer. (No memcpy, overlaps allowed) // Move remaining characters down to start of buffer. (No memcpy, overlaps allowed)
uint8_t* rp = m_bufp; uint8_t* rp = m_bufp;
for (uint8_t* sp = m_cp; sp < m_endp; *rp++ = *sp++) {} // Overlaps for (const uint8_t* sp = m_cp; sp < m_endp; *rp++ = *sp++) {} // Overlaps
m_endp = m_bufp + (m_endp - m_cp); m_endp = m_bufp + (m_endp - m_cp);
m_cp = m_bufp; // Reset buffer m_cp = m_bufp; // Reset buffer
// Read into buffer starting at m_endp // Read into buffer starting at m_endp

View File

@ -47,8 +47,10 @@ protected:
std::string m_filename; // Filename, for error messages std::string m_filename; // Filename, for error messages
VerilatedAssertOneThread m_assertOne; // Assert only called from single thread VerilatedAssertOneThread m_assertOne; // Assert only called from single thread
static constexpr size_t bufferSize() { return 256 * 1024; } // See below for slack calculation static constexpr size_t bufferSize() {
static constexpr size_t bufferInsertSize() { return 16 * 1024; } return 256 * 1024L;
} // See below for slack calculation
static constexpr size_t bufferInsertSize() { return 16 * 1024L; }
void header() VL_MT_UNSAFE_ONE; void header() VL_MT_UNSAFE_ONE;
void trailer() VL_MT_UNSAFE_ONE; void trailer() VL_MT_UNSAFE_ONE;
@ -119,8 +121,10 @@ protected:
std::string m_filename; // Filename, for error messages std::string m_filename; // Filename, for error messages
VerilatedAssertOneThread m_assertOne; // Assert only called from single thread VerilatedAssertOneThread m_assertOne; // Assert only called from single thread
static constexpr size_t bufferSize() { return 256 * 1024; } // See below for slack calculation static constexpr size_t bufferSize() {
static constexpr size_t bufferInsertSize() { return 16 * 1024; } return 256 * 1024L;
} // See below for slack calculation
static constexpr size_t bufferInsertSize() { return 16 * 1024L; }
virtual void fill() = 0; virtual void fill() = 0;
void header() VL_MT_UNSAFE_ONE; void header() VL_MT_UNSAFE_ONE;

View File

@ -99,7 +99,7 @@ void VlDelayScheduler::dump() const {
VL_DBG_MSGF(" No delayed processes:\n"); VL_DBG_MSGF(" No delayed processes:\n");
} else { } else {
VL_DBG_MSGF(" Delayed processes:\n"); VL_DBG_MSGF(" Delayed processes:\n");
for (auto& susp : m_zeroDelayed) { for (const auto& susp : m_zeroDelayed) {
VL_DBG_MSGF(" Awaiting #0-delayed resumption, " VL_DBG_MSGF(" Awaiting #0-delayed resumption, "
"time () %" PRIu64 ": ", "time () %" PRIu64 ": ",
m_context.time()); m_context.time());

View File

@ -499,7 +499,7 @@ private:
public: public:
// CONSTRUCTORS // CONSTRUCTORS
// m_defaultValue isn't defaulted. Caller's constructor must do it. // cppcheck-suppress uninitMember // m_defaultValue isn't defaulted, caller's constructor must
VlQueue() = default; VlQueue() = default;
~VlQueue() = default; ~VlQueue() = default;
VlQueue(const VlQueue&) = default; VlQueue(const VlQueue&) = default;

View File

@ -490,6 +490,7 @@ VerilatedVcd::Buffer* VerilatedVcd::getTraceBuffer(uint32_t fidx) {
// Note: This is called from VerilatedVcd::dump, which already holds the lock // Note: This is called from VerilatedVcd::dump, which already holds the lock
// If no buffer available, allocate a new one // If no buffer available, allocate a new one
if (m_freeBuffers.empty()) { if (m_freeBuffers.empty()) {
// cppcheck-suppress unreadVariable // cppcheck bug, used below
constexpr size_t pageSize = 4096; constexpr size_t pageSize = 4096;
// 4 * m_maxSignalBytes, so we can reserve 2 * m_maxSignalBytes at the end for safety // 4 * m_maxSignalBytes, so we can reserve 2 * m_maxSignalBytes at the end for safety
size_t startingSize = roundUpToMultipleOf<pageSize>(4 * m_maxSignalBytes); size_t startingSize = roundUpToMultipleOf<pageSize>(4 * m_maxSignalBytes);

View File

@ -114,6 +114,7 @@ public:
#endif #endif
} }
// MEMBERS // MEMBERS
// cppcheck-suppress duplInheritedMember
static VerilatedVpio* castp(vpiHandle h) { static VerilatedVpio* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpio*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpio*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -144,6 +145,7 @@ public:
, m_time{time} , m_time{time}
, m_reason{reason} {} , m_reason{reason} {}
~VerilatedVpioReasonCb() override = default; ~VerilatedVpioReasonCb() override = default;
// cppcheck-suppress duplInheritedMember
static VerilatedVpioReasonCb* castp(vpiHandle h) { static VerilatedVpioReasonCb* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioReasonCb*>(reinterpret_cast<VerilatedVpioReasonCb*>(h)); return dynamic_cast<VerilatedVpioReasonCb*>(reinterpret_cast<VerilatedVpioReasonCb*>(h));
} }
@ -158,6 +160,7 @@ public:
explicit VerilatedVpioConst(int32_t num) explicit VerilatedVpioConst(int32_t num)
: m_num{num} {} : m_num{num} {}
~VerilatedVpioConst() override = default; ~VerilatedVpioConst() override = default;
// cppcheck-suppress duplInheritedMember
static VerilatedVpioConst* castp(vpiHandle h) { static VerilatedVpioConst* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioConst*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioConst*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -187,6 +190,7 @@ public:
m_indexedDim = varp->m_indexedDim; m_indexedDim = varp->m_indexedDim;
} }
} }
// cppcheck-suppress duplInheritedMember
static VerilatedVpioVarBase* castp(vpiHandle h) { static VerilatedVpioVarBase* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioVarBase*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioVarBase*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -258,6 +262,7 @@ public:
: VerilatedVpioVarBase{varp, scopep} {} : VerilatedVpioVarBase{varp, scopep} {}
~VerilatedVpioParam() override = default; ~VerilatedVpioParam() override = default;
// cppcheck-suppress duplInheritedMember
static VerilatedVpioParam* castp(vpiHandle h) { static VerilatedVpioParam* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioParam*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioParam*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -283,6 +288,7 @@ public:
explicit VerilatedVpioRange(const VerilatedRange* rangep) explicit VerilatedVpioRange(const VerilatedRange* rangep)
: m_rangep{rangep} {} : m_rangep{rangep} {}
~VerilatedVpioRange() override = default; ~VerilatedVpioRange() override = default;
// cppcheck-suppress duplInheritedMember
static VerilatedVpioRange* castp(vpiHandle h) { static VerilatedVpioRange* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioRange*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioRange*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -301,6 +307,7 @@ public:
m_iter = m_ranges.begin(); m_iter = m_ranges.begin();
} }
~VerilatedVpioRangeIter() override = default; ~VerilatedVpioRangeIter() override = default;
// cppcheck-suppress duplInheritedMember
static VerilatedVpioRangeIter* castp(vpiHandle h) { static VerilatedVpioRangeIter* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioRangeIter*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioRangeIter*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -333,6 +340,7 @@ public:
m_defname = m_scopep->defname(); m_defname = m_scopep->defname();
} }
~VerilatedVpioScope() override = default; ~VerilatedVpioScope() override = default;
// cppcheck-suppress duplInheritedMember
static VerilatedVpioScope* castp(vpiHandle h) { static VerilatedVpioScope* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioScope*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioScope*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -379,6 +387,7 @@ public:
~VerilatedVpioVar() override { ~VerilatedVpioVar() override {
if (m_prevDatap) VL_DO_CLEAR(delete[] m_prevDatap, m_prevDatap = nullptr); if (m_prevDatap) VL_DO_CLEAR(delete[] m_prevDatap, m_prevDatap = nullptr);
} }
// cppcheck-suppress duplInheritedMember
static VerilatedVpioVar* castp(vpiHandle h) { static VerilatedVpioVar* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioVar*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioVar*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -450,6 +459,7 @@ public:
m_topscopep = Verilated::threadContextp()->scopeFind("TOP"); m_topscopep = Verilated::threadContextp()->scopeFind("TOP");
} }
~VerilatedVpioVarIter() override = default; ~VerilatedVpioVarIter() override = default;
// cppcheck-suppress duplInheritedMember
static VerilatedVpioVarIter* castp(vpiHandle h) { static VerilatedVpioVarIter* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioVarIter*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioVarIter*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -508,6 +518,7 @@ public:
for (auto it : m_ranges) m_nextIndex.push_back(it.right()); for (auto it : m_ranges) m_nextIndex.push_back(it.right());
} }
~VerilatedVpioRegIter() override = default; ~VerilatedVpioRegIter() override = default;
// cppcheck-suppress duplInheritedMember
static VerilatedVpioRegIter* castp(vpiHandle h) { static VerilatedVpioRegIter* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioRegIter*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioRegIter*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -562,6 +573,7 @@ public:
} }
if (VL_UNLIKELY(pos == std::string::npos)) m_toplevel = true; if (VL_UNLIKELY(pos == std::string::npos)) m_toplevel = true;
} }
// cppcheck-suppress duplInheritedMember
static VerilatedVpioModule* castp(vpiHandle h) { static VerilatedVpioModule* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioModule*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioModule*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -578,6 +590,7 @@ public:
m_it = m_vec->begin(); m_it = m_vec->begin();
} }
~VerilatedVpioModuleIter() override = default; ~VerilatedVpioModuleIter() override = default;
// cppcheck-suppress duplInheritedMember
static VerilatedVpioModuleIter* castp(vpiHandle h) { static VerilatedVpioModuleIter* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioModuleIter*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioModuleIter*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -607,6 +620,7 @@ public:
m_it = m_vec->begin(); m_it = m_vec->begin();
} }
~VerilatedVpioScopeIter() override = default; ~VerilatedVpioScopeIter() override = default;
// cppcheck-suppress duplInheritedMember
static VerilatedVpioScopeIter* castp(vpiHandle h) { static VerilatedVpioScopeIter* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioScopeIter*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioScopeIter*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -640,6 +654,7 @@ public:
if (strcmp(m_name, "\\$unit ") == 0) m_name = d_unit; if (strcmp(m_name, "\\$unit ") == 0) m_name = d_unit;
} }
// cppcheck-suppress duplInheritedMember
static VerilatedVpioPackage* castp(vpiHandle h) { static VerilatedVpioPackage* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioPackage*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioPackage*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -657,6 +672,7 @@ public:
m_it = m_vec->begin(); m_it = m_vec->begin();
} }
~VerilatedVpioInstanceIter() override = default; ~VerilatedVpioInstanceIter() override = default;
// cppcheck-suppress duplInheritedMember
static VerilatedVpioInstanceIter* castp(vpiHandle h) { static VerilatedVpioInstanceIter* castp(vpiHandle h) {
return dynamic_cast<VerilatedVpioInstanceIter*>(reinterpret_cast<VerilatedVpio*>(h)); return dynamic_cast<VerilatedVpioInstanceIter*>(reinterpret_cast<VerilatedVpio*>(h));
} }
@ -1041,7 +1057,7 @@ public:
} }
if (was_last) break; if (was_last) break;
} }
for (const auto& ip : update) { for (const VerilatedVpioVar* const ip : update) {
std::memcpy(ip->prevDatap(), ip->varDatap(), ip->entSize()); std::memcpy(ip->prevDatap(), ip->varDatap(), ip->entSize());
} }
return called; return called;
@ -2540,7 +2556,7 @@ void vl_vpi_put_word_gen(const VerilatedVpioVar* vop, T word, size_t bitCount, s
= (info.m_datap[info.m_wordOffset + 1] & ~info.m_maskHi) = (info.m_datap[info.m_wordOffset + 1] & ~info.m_maskHi)
| ((word >> (wordBits - info.m_bitOffset)) & info.m_maskHi); | ((word >> (wordBits - info.m_bitOffset)) & info.m_maskHi);
} }
// cppcheck-has-bug-suppress unreadVariable // cppcheck-suppress unreadVariable
info.m_datap[info.m_wordOffset] = (info.m_datap[info.m_wordOffset] & ~info.m_maskLo) info.m_datap[info.m_wordOffset] = (info.m_datap[info.m_wordOffset] & ~info.m_maskLo)
| ((word << info.m_bitOffset) & info.m_maskLo); | ((word << info.m_bitOffset) & info.m_maskLo);
} }
@ -3589,12 +3605,14 @@ PLI_INT32 vpi_printf(PLI_BYTE8* formatp, ...) {
return chars; return chars;
} }
// cppcheck-suppress constParameterPointer
PLI_INT32 vpi_vprintf(PLI_BYTE8* formatp, va_list ap) { PLI_INT32 vpi_vprintf(PLI_BYTE8* formatp, va_list ap) {
VerilatedVpiImp::assertOneCheck(); VerilatedVpiImp::assertOneCheck();
VL_VPI_ERROR_RESET_(); VL_VPI_ERROR_RESET_();
return VL_VPRINTF(formatp, ap); return VL_VPRINTF(formatp, ap);
} }
// cppcheck-suppress constParameterPointer
PLI_INT32 vpi_mcd_vprintf(PLI_UINT32 mcd, PLI_BYTE8* format, va_list ap) { PLI_INT32 vpi_mcd_vprintf(PLI_UINT32 mcd, PLI_BYTE8* format, va_list ap) {
VerilatedVpiImp::assertOneCheck(); VerilatedVpiImp::assertOneCheck();
FILE* const fp = VL_CVT_I_FP(mcd); FILE* const fp = VL_CVT_I_FP(mcd);
@ -3631,10 +3649,10 @@ PLI_INT32 vpi_chk_error(p_vpi_error_info error_info_p) {
// executing vpi_chk_error does not reset error // executing vpi_chk_error does not reset error
// error_info_p can be nullptr, so only return level in that case // error_info_p can be nullptr, so only return level in that case
VerilatedVpiImp::assertOneCheck(); VerilatedVpiImp::assertOneCheck();
p_vpi_error_info const _error_info_p = VerilatedVpiImp::error_info()->getError(); const p_vpi_error_info imp_info_p = VerilatedVpiImp::error_info()->getError();
if (error_info_p && _error_info_p) *error_info_p = *_error_info_p; if (error_info_p && imp_info_p) *error_info_p = *imp_info_p;
if (!_error_info_p) return 0; // no error occurred if (!imp_info_p) return 0; // no error occurred
return _error_info_p->level; // return error severity level return imp_info_p->level; // return error severity level
} }
#ifndef VL_NO_LEGACY #ifndef VL_NO_LEGACY