diff --git a/Makefile.in b/Makefile.in index 763b18f94..0ed2b5cf7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -392,7 +392,6 @@ install-msg: ###################################################################### # Format/Lint -# Use --xml flag to see the cppcheck code to use for suppression CPPCHECK1_CPP = $(wildcard $(srcdir)/include/*.cpp) CPPCHECK2_CPP = $(wildcard $(srcdir)/examples/*/*.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 -$(CPPCHECK_CACHE): - mkdir -p $@ +$(CPPCHECK_CACHE): $(CHECK_CPP) $(CHECK_H) $(CHECK_YL) + /bin/rm -rf $@ + /bin/mkdir -p $@ cppcheck: cppcheck-1 cppcheck-2 cppcheck-3 cppcheck-4 cppcheck-5 cppcheck-6 cppcheck-7 cppcheck-8 cppcheck-1: | $(CPPCHECK_CACHE) diff --git a/include/verilated.cpp b/include/verilated.cpp index 3fe16f361..73cc45884 100644 --- a/include/verilated.cpp +++ b/include/verilated.cpp @@ -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);); owp[0] = 1; for (int i = 1; i < VL_WORDS_I(obits); ++i) owp[i] = 0; - // cppcheck-has-bug-suppress variableScope VlWide powstore; // Fixed size, as MSVC++ doesn't allow [words] here VlWide lastpowstore; // Fixed size, as MSVC++ doesn't allow [words] here VlWide lastoutstore; // Fixed size, as MSVC++ doesn't allow [words] here - // cppcheck-has-bug-suppress variableScope VL_ASSIGN_W(obits, powstore, lwp); for (int bit = 0; bit < rbits; ++bit) { 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_read_str(fp, floc, fromp, fstr, t_tmp, "+-.0123456789eE"); if (!t_tmp[0]) goto done; - // cppcheck-has-bug-suppress unusedStructMember, unreadVariable union { double r; int64_t ld; @@ -2151,7 +2148,6 @@ VlReadMem::VlReadMem(bool hex, int bits, const std::string& filename, QData star if (VL_UNLIKELY(!m_fp)) { // 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"); - // cppcheck-has-bug-suppress resourceLeak // m_fp is nullptr 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"); if (VL_UNLIKELY(!m_fp)) { VL_FATAL_MT(filename.c_str(), 0, "", "$writemem file not found"); - // cppcheck-has-bug-suppress resourceLeak // m_fp is nullptr return; } } @@ -2475,7 +2470,6 @@ static const char* vl_time_str(int scale) VL_PURE { double vl_time_multiplier(int scale) VL_PURE { // Return timescale multiplier -18 to +18 // For speed, this does not check for illegal values - // cppcheck-has-bug-suppress arrayIndexOutOfBoundsCond if (scale < 0) { static const double neg10[] = {1.0, 0.1, @@ -2496,7 +2490,6 @@ double vl_time_multiplier(int scale) VL_PURE { 0.0000000000000001, 0.00000000000000001, 0.000000000000000001}; - // cppcheck-has-bug-suppress arrayIndexOutOfBoundsCond return neg10[-scale]; } else { static const double pow10[] = {1.0, @@ -2518,7 +2511,6 @@ double vl_time_multiplier(int scale) VL_PURE { 10000000000000000.0, 100000000000000000.0, 1000000000000000000.0}; - // cppcheck-has-bug-suppress arrayIndexOutOfBoundsCond return pow10[scale]; } } @@ -2814,7 +2806,7 @@ void VerilatedContext::internalsDump() const VL_MT_SAFE { VerilatedImp::userDump(); } -void VerilatedContext::addModel(VerilatedModel* modelp) { +void VerilatedContext::addModel(const VerilatedModel* modelp) { if (!quiet()) { // 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 @@ -2852,7 +2844,7 @@ VerilatedVirtualBase* VerilatedContext::threadPoolp() { void VerilatedContext::prepareClone() { delete m_threadPool.release(); } 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(new VlThreadPool{this, m_threads - 1}); return m_threadPool.get(); } @@ -3133,7 +3125,7 @@ void VerilatedContext::trace(VerilatedTraceBaseC* tfp, int levels, int options) VL_FATAL_MT("", 0, "", "Testbench C call to 'VerilatedContext::trace()' requires model(s) Verilated" " 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 { // Model creation registering a callback for when Verilated::trace() called @@ -3148,7 +3140,6 @@ VerilatedSyms::VerilatedSyms(VerilatedContext* contextp) : _vm_contextp__(contextp ? contextp : Verilated::threadContextp()) { VerilatedContext::checkMagic(_vm_contextp__); Verilated::threadContextp(_vm_contextp__); - // cppcheck-has-bug-suppress noCopyConstructor __Vm_evalMsgQp = new VerilatedEvalMsgQueue; } @@ -3550,16 +3541,16 @@ void VerilatedScope::scopeDump() const { VerilatedImp::exportName(i)); } } - if (const VerilatedVarNameMap* const varsp = this->varsp()) { - for (const auto& i : *varsp) VL_PRINTF_MT(" VAR %p: %s\n", &(i.second), i.first); + if (const VerilatedVarNameMap* const ivarsp = this->varsp()) { + 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); } -void VerilatedHierarchy::remove(VerilatedScope* fromp, VerilatedScope* top) { +void VerilatedHierarchy::remove(const VerilatedScope* fromp, const VerilatedScope* top) { VerilatedImp::hierarchyRemove(fromp, top); } diff --git a/include/verilated.h b/include/verilated.h index 799cc4bb4..294ab94a1 100644 --- a/include/verilated.h +++ b/include/verilated.h @@ -644,7 +644,7 @@ public: } // Internal: Model and thread setup - void addModel(VerilatedModel*); + void addModel(const VerilatedModel* modelp); VerilatedVirtualBase* threadPoolp(); void prepareClone(); VerilatedVirtualBase* threadPoolpOnClone(); @@ -763,8 +763,8 @@ public: // But internals only - called from VerilatedModule's class VerilatedHierarchy final { public: - static void add(VerilatedScope* fromp, VerilatedScope* top); - static void remove(VerilatedScope* fromp, VerilatedScope* top); + static void add(const VerilatedScope* fromp, const VerilatedScope* top); + static void remove(const VerilatedScope* fromp, const VerilatedScope* top); }; //=========================================================================== diff --git a/include/verilated_cov.cpp b/include/verilated_cov.cpp index d81742199..96e7bb1d1 100644 --- a/include/verilated_cov.cpp +++ b/include/verilated_cov.cpp @@ -255,17 +255,21 @@ private: public: // PUBLIC METHODS + // cppcheck-suppress dupInheritedMember std::string defaultFilename() VL_MT_SAFE { return m_contextp->coverageFilename(); } + // cppcheck-suppress dupInheritedMember void forcePerInstance(const bool flag) VL_MT_SAFE_EXCLUDES(m_mutex) { Verilated::quiesce(); const VerilatedLockGuard lock{m_mutex}; m_forcePerInstance = flag; } + // cppcheck-suppress dupInheritedMember void clear() VL_MT_SAFE_EXCLUDES(m_mutex) { Verilated::quiesce(); const VerilatedLockGuard lock{m_mutex}; clearGuts(); } + // cppcheck-suppress dupInheritedMember void clearNonMatch(const char* const matchp) VL_MT_SAFE_EXCLUDES(m_mutex) { Verilated::quiesce(); const VerilatedLockGuard lock{m_mutex}; @@ -281,10 +285,11 @@ public: m_items = newlist; } } + // cppcheck-suppress dupInheritedMember void zero() VL_MT_SAFE_EXCLUDES(m_mutex) { Verilated::quiesce(); 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 @@ -307,6 +312,7 @@ public: valps[0] = m_insertFilenamep; const std::string linestr = std::to_string(m_insertLineno); ckeyps[1] = "lineno"; + // cppcheck-suppress autoVariables // Used only below for insert valps[1] = linestr.c_str(); // Default page if not specified const char* fnstartp = m_insertFilenamep; @@ -316,6 +322,7 @@ public: const size_t page_len = fnendp - fnstartp; const std::string page_default = "sp_user/" + std::string{fnstartp, page_len}; ckeyps[2] = "page"; + // cppcheck-suppress autoVariables // Used only below for insert valps[2] = page_default.c_str(); // Keys -> strings @@ -357,6 +364,7 @@ public: m_insertp = nullptr; } + // cppcheck-suppress dupInheritedMember void write(const std::string& filename) VL_MT_SAFE_EXCLUDES(m_mutex) { Verilated::quiesce(); const VerilatedLockGuard lock{m_mutex}; diff --git a/include/verilated_dpi.cpp b/include/verilated_dpi.cpp index 9e2b1cf39..208db5feb 100644 --- a/include/verilated_dpi.cpp +++ b/include/verilated_dpi.cpp @@ -290,7 +290,7 @@ static void _vl_svGetBitArrElemVecVal(svBitVecVal* d, const svOpenArrayHandle s, break; } case VLVT_WDATA: { - WDataOutP wdatap = (reinterpret_cast(datap)); + WDataInP wdatap = (reinterpret_cast(datap)); for (int i = 0; i < VL_WORDS_I(varp->entBits()); ++i) d[i] = wdatap[i]; return; } @@ -329,7 +329,7 @@ static void _vl_svGetLogicArrElemVecVal(svLogicVecVal* d, const svOpenArrayHandl break; } case VLVT_WDATA: { - WDataOutP wdatap = (reinterpret_cast(datap)); + WDataInP wdatap = (reinterpret_cast(datap)); for (int i = 0; i < VL_WORDS_I(varp->entBits()); ++i) { d[i].aval = wdatap[i]; d[i].bval = 0; diff --git a/include/verilated_fst_c.cpp b/include/verilated_fst_c.cpp index bd2281030..604bee576 100644 --- a/include/verilated_fst_c.cpp +++ b/include/verilated_fst_c.cpp @@ -297,7 +297,7 @@ VerilatedFst::Buffer* VerilatedFst::getTraceBuffer(uint32_t fidx) { void VerilatedFst::commitTraceBuffer(VerilatedFst::Buffer* bufp) { if (offload()) { - OffloadBuffer* const offloadBufferp = static_cast(bufp); + const OffloadBuffer* const offloadBufferp = static_cast(bufp); if (offloadBufferp->m_offloadBufferWritep) { m_offloadBufferWritep = offloadBufferp->m_offloadBufferWritep; return; // Buffer will be deleted by the offload thread diff --git a/include/verilated_funcs.h b/include/verilated_funcs.h index f8c5ef0a7..c18c32022 100644 --- a/include/verilated_funcs.h +++ b/include/verilated_funcs.h @@ -652,7 +652,7 @@ static inline IData VL_REDAND_IW(int lbits, WDataInP const lwp) VL_PURE { EData combine = lwp[0]; for (int i = 1; i < words - 1; ++i) combine &= lwp[i]; combine &= ~VL_MASK_E(lbits) | lwp[words - 1]; - // cppcheck-has-bug-suppress knownConditionTrueFalse + // cppcheck-suppress knownConditionTrueFalse return ((~combine) == 0); } @@ -1094,14 +1094,12 @@ static inline WDataOutP VL_MULS_WWW(int lbits, WDataOutP owp, WDataInP const lwp if (lneg) { // Negate lhs lwusp = lwstore; VL_NEGATE_W(words, lwstore, lwp); - // cppcheck-has-bug-suppress unreadVariable lwstore[words - 1] &= VL_MASK_E(lbits); // Clean it } const EData rneg = VL_SIGN_E(lbits, rwp[words - 1]); if (rneg) { // Negate rhs rwusp = rwstore; VL_NEGATE_W(words, rwstore, rwp); - // cppcheck-has-bug-suppress unreadVariable rwstore[words - 1] &= VL_MASK_E(lbits); // Clean it } 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 insmask = VL_MASK_E(w); iowp[0] = (iowp[0] & ~insmask) | ((rwp[wordoff] >> lsb) & insmask); + // cppcheck-suppress knownConditionTrueFalse if (w == obits) return; obits -= w; } diff --git a/include/verilated_imp.h b/include/verilated_imp.h index cdc801b53..603f896c4 100644 --- a/include/verilated_imp.h +++ b/include/verilated_imp.h @@ -363,7 +363,7 @@ private: VerilatedFpList fdToFpList(IData fdi) VL_REQUIRES(m_fdMutex) { VerilatedFpList fp; // cppverilator-suppress integerOverflow shiftTooManyBitsSigned - if ((fdi & (1 << 31)) != 0) { + if (VL_BITISSET_I(fdi, 31)) { // Non-MCD case const IData idx = fdi & VL_MASK_I(31); switch (idx) { diff --git a/include/verilated_profiler.cpp b/include/verilated_profiler.cpp index 310345137..35617db6c 100644 --- a/include/verilated_profiler.cpp +++ b/include/verilated_profiler.cpp @@ -145,7 +145,7 @@ void VlExecutionProfiler::dump(const char* filenamep, uint64_t tickEnd) fprintf(fp, "VLPROF arg +verilator+prof+exec+window+%u\n", Verilated::threadContextp()->profExecWindow()); std::string numa = "no threads"; - if (VlThreadPool* const threadPoolp + if (const VlThreadPool* const threadPoolp = static_cast(Verilated::threadContextp()->threadPoolp())) { numa = threadPoolp->numaStatus(); } diff --git a/include/verilated_random.cpp b/include/verilated_random.cpp index c61c95880..b822c2f09 100644 --- a/include/verilated_random.cpp +++ b/include/verilated_random.cpp @@ -455,8 +455,8 @@ bool VlRandomizer::parseSolution(std::iostream& f) { const auto it = m_vars.find(name); if (it == m_vars.end()) continue; const VlRandomVar& varr = *it->second; - if (m_randmode && !varr.randModeIdxNone()) { - if (!(m_randmode->at(varr.randModeIdx()))) continue; + if (m_randmodep && !varr.randModeIdxNone()) { + if (!m_randmodep->at(varr.randModeIdx())) continue; } if (!indices.empty()) { std::ostringstream oss; diff --git a/include/verilated_random.h b/include/verilated_random.h index b3bea7147..ce9f22ab1 100644 --- a/include/verilated_random.h +++ b/include/verilated_random.h @@ -200,7 +200,7 @@ class VlRandomizer final { std::map> m_vars; // Solver-dependent // variables ArrayInfoMap m_arr_vars; // Tracks each element in array structures for iteration - const VlQueue* m_randmode; // rand_mode state; + const VlQueue* m_randmodep = nullptr; // rand_mode state; int m_index = 0; // Internal counter for key generation // PRIVATE METHODS @@ -574,7 +574,7 @@ public: void hard(std::string&& constraint); void clear(); - void set_randmode(const VlQueue& randmode) { m_randmode = &randmode; } + void set_randmode(const VlQueue& randmode) { m_randmodep = &randmode; } #ifdef VL_DEBUG void dump() const; #endif diff --git a/include/verilated_save.cpp b/include/verilated_save.cpp index b866de572..d9807d2e2 100644 --- a/include/verilated_save.cpp +++ b/include/verilated_save.cpp @@ -220,7 +220,7 @@ void VerilatedRestore::fill() VL_MT_UNSAFE_ONE { if (VL_UNLIKELY(!isOpen())) return; // Move remaining characters down to start of buffer. (No memcpy, overlaps allowed) 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_cp = m_bufp; // Reset buffer // Read into buffer starting at m_endp diff --git a/include/verilated_save.h b/include/verilated_save.h index c1a7c4a0f..c28fda329 100644 --- a/include/verilated_save.h +++ b/include/verilated_save.h @@ -47,8 +47,10 @@ protected: std::string m_filename; // Filename, for error messages 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 bufferInsertSize() { return 16 * 1024; } + static constexpr size_t bufferSize() { + return 256 * 1024L; + } // See below for slack calculation + static constexpr size_t bufferInsertSize() { return 16 * 1024L; } void header() VL_MT_UNSAFE_ONE; void trailer() VL_MT_UNSAFE_ONE; @@ -119,8 +121,10 @@ protected: std::string m_filename; // Filename, for error messages 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 bufferInsertSize() { return 16 * 1024; } + static constexpr size_t bufferSize() { + return 256 * 1024L; + } // See below for slack calculation + static constexpr size_t bufferInsertSize() { return 16 * 1024L; } virtual void fill() = 0; void header() VL_MT_UNSAFE_ONE; diff --git a/include/verilated_timing.cpp b/include/verilated_timing.cpp index 0724a43e9..58c21bdb4 100644 --- a/include/verilated_timing.cpp +++ b/include/verilated_timing.cpp @@ -99,7 +99,7 @@ void VlDelayScheduler::dump() const { VL_DBG_MSGF(" No delayed processes:\n"); } else { VL_DBG_MSGF(" Delayed processes:\n"); - for (auto& susp : m_zeroDelayed) { + for (const auto& susp : m_zeroDelayed) { VL_DBG_MSGF(" Awaiting #0-delayed resumption, " "time () %" PRIu64 ": ", m_context.time()); diff --git a/include/verilated_types.h b/include/verilated_types.h index 91f9e8cba..969fdec7c 100644 --- a/include/verilated_types.h +++ b/include/verilated_types.h @@ -499,7 +499,7 @@ private: public: // 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(const VlQueue&) = default; diff --git a/include/verilated_vcd_c.cpp b/include/verilated_vcd_c.cpp index ee4581a0d..ccab11a6d 100644 --- a/include/verilated_vcd_c.cpp +++ b/include/verilated_vcd_c.cpp @@ -490,6 +490,7 @@ VerilatedVcd::Buffer* VerilatedVcd::getTraceBuffer(uint32_t fidx) { // Note: This is called from VerilatedVcd::dump, which already holds the lock // If no buffer available, allocate a new one if (m_freeBuffers.empty()) { + // cppcheck-suppress unreadVariable // cppcheck bug, used below constexpr size_t pageSize = 4096; // 4 * m_maxSignalBytes, so we can reserve 2 * m_maxSignalBytes at the end for safety size_t startingSize = roundUpToMultipleOf(4 * m_maxSignalBytes); diff --git a/include/verilated_vpi.cpp b/include/verilated_vpi.cpp index 144587e91..5cd59ffc6 100644 --- a/include/verilated_vpi.cpp +++ b/include/verilated_vpi.cpp @@ -114,6 +114,7 @@ public: #endif } // MEMBERS + // cppcheck-suppress duplInheritedMember static VerilatedVpio* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -144,6 +145,7 @@ public: , m_time{time} , m_reason{reason} {} ~VerilatedVpioReasonCb() override = default; + // cppcheck-suppress duplInheritedMember static VerilatedVpioReasonCb* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -158,6 +160,7 @@ public: explicit VerilatedVpioConst(int32_t num) : m_num{num} {} ~VerilatedVpioConst() override = default; + // cppcheck-suppress duplInheritedMember static VerilatedVpioConst* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -187,6 +190,7 @@ public: m_indexedDim = varp->m_indexedDim; } } + // cppcheck-suppress duplInheritedMember static VerilatedVpioVarBase* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -258,6 +262,7 @@ public: : VerilatedVpioVarBase{varp, scopep} {} ~VerilatedVpioParam() override = default; + // cppcheck-suppress duplInheritedMember static VerilatedVpioParam* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -283,6 +288,7 @@ public: explicit VerilatedVpioRange(const VerilatedRange* rangep) : m_rangep{rangep} {} ~VerilatedVpioRange() override = default; + // cppcheck-suppress duplInheritedMember static VerilatedVpioRange* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -301,6 +307,7 @@ public: m_iter = m_ranges.begin(); } ~VerilatedVpioRangeIter() override = default; + // cppcheck-suppress duplInheritedMember static VerilatedVpioRangeIter* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -333,6 +340,7 @@ public: m_defname = m_scopep->defname(); } ~VerilatedVpioScope() override = default; + // cppcheck-suppress duplInheritedMember static VerilatedVpioScope* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -379,6 +387,7 @@ public: ~VerilatedVpioVar() override { if (m_prevDatap) VL_DO_CLEAR(delete[] m_prevDatap, m_prevDatap = nullptr); } + // cppcheck-suppress duplInheritedMember static VerilatedVpioVar* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -450,6 +459,7 @@ public: m_topscopep = Verilated::threadContextp()->scopeFind("TOP"); } ~VerilatedVpioVarIter() override = default; + // cppcheck-suppress duplInheritedMember static VerilatedVpioVarIter* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -508,6 +518,7 @@ public: for (auto it : m_ranges) m_nextIndex.push_back(it.right()); } ~VerilatedVpioRegIter() override = default; + // cppcheck-suppress duplInheritedMember static VerilatedVpioRegIter* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -562,6 +573,7 @@ public: } if (VL_UNLIKELY(pos == std::string::npos)) m_toplevel = true; } + // cppcheck-suppress duplInheritedMember static VerilatedVpioModule* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -578,6 +590,7 @@ public: m_it = m_vec->begin(); } ~VerilatedVpioModuleIter() override = default; + // cppcheck-suppress duplInheritedMember static VerilatedVpioModuleIter* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -607,6 +620,7 @@ public: m_it = m_vec->begin(); } ~VerilatedVpioScopeIter() override = default; + // cppcheck-suppress duplInheritedMember static VerilatedVpioScopeIter* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -640,6 +654,7 @@ public: if (strcmp(m_name, "\\$unit ") == 0) m_name = d_unit; } + // cppcheck-suppress duplInheritedMember static VerilatedVpioPackage* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -657,6 +672,7 @@ public: m_it = m_vec->begin(); } ~VerilatedVpioInstanceIter() override = default; + // cppcheck-suppress duplInheritedMember static VerilatedVpioInstanceIter* castp(vpiHandle h) { return dynamic_cast(reinterpret_cast(h)); } @@ -1041,7 +1057,7 @@ public: } if (was_last) break; } - for (const auto& ip : update) { + for (const VerilatedVpioVar* const ip : update) { std::memcpy(ip->prevDatap(), ip->varDatap(), ip->entSize()); } 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) | ((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) | ((word << info.m_bitOffset) & info.m_maskLo); } @@ -3589,12 +3605,14 @@ PLI_INT32 vpi_printf(PLI_BYTE8* formatp, ...) { return chars; } +// cppcheck-suppress constParameterPointer PLI_INT32 vpi_vprintf(PLI_BYTE8* formatp, va_list ap) { VerilatedVpiImp::assertOneCheck(); VL_VPI_ERROR_RESET_(); return VL_VPRINTF(formatp, ap); } +// cppcheck-suppress constParameterPointer PLI_INT32 vpi_mcd_vprintf(PLI_UINT32 mcd, PLI_BYTE8* format, va_list ap) { VerilatedVpiImp::assertOneCheck(); 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 // error_info_p can be nullptr, so only return level in that case VerilatedVpiImp::assertOneCheck(); - p_vpi_error_info const _error_info_p = VerilatedVpiImp::error_info()->getError(); - if (error_info_p && _error_info_p) *error_info_p = *_error_info_p; - if (!_error_info_p) return 0; // no error occurred - return _error_info_p->level; // return error severity level + const p_vpi_error_info imp_info_p = VerilatedVpiImp::error_info()->getError(); + if (error_info_p && imp_info_p) *error_info_p = *imp_info_p; + if (!imp_info_p) return 0; // no error occurred + return imp_info_p->level; // return error severity level } #ifndef VL_NO_LEGACY