tree 596e799e21d22efe8cbbe17dfd73df60c65c6855
parent 6f04b229a94b531ace56024ddd811add8b4ef6e5
author George Liu <liuxiwei@inspur.com> 1657155552 +0800
committer George Liu <liuxiwei@inspur.com> 1657197071 +0800

Fix cppcheck warnings

Warning message:
mslverify/verify.cpp:30:5: style: Struct 'BusMeetsMSL < decltype ( arg . second ) :: value_type >' has a constructor with 1 argument that is not explicit. [noExplicitConstructor]
    BusMeetsMSL(const std::string& p) : path(p)
    ^
src/callback.hpp:222:5: warning: Member variable 'DeferrableCallback::ctx' is not initialized in the constructor. [uninitMemberVar]
    DeferrableCallback(const std::vector<size_t>& graphEntry, Conditional& cond,
    ^
src/elog.hpp:102:5: style: Class 'Elog' has a constructor with 1 argument that is not explicit. [noExplicitConstructor]
    Elog(Args&&... arguments) :
    ^
src/propertywatch.hpp:133:5: style: Class 'PropertyWatchOfType' has a constructor with 1 argument that is not explicit. [noExplicitConstructor]
    PropertyWatchOfType(const PropertyIndex& watchIndex,
    ^
src/event_manager.cpp:56:18: style: Local variable 'path' shadows outer variable [shadowVariable]
        fs::path path(eventQueue.back()->objectPath);
                 ^
src/event_manager.cpp:44:10: note: Shadowed declaration
    auto path = "path="s + objectPath;
         ^
src/event_manager.cpp:56:18: note: Shadow variable
        fs::path path(eventQueue.back()->objectPath);
                 ^
src/snmp_trap.hpp:65:10: style: The function 'operator()' overrides a function in a base class but is not marked with a 'override' specifier. [missingOverride]
    void operator()(Context /* ctx */)
         ^
src/callback.hpp:41:18: note: Virtual function in base class
    virtual void operator()(Context /* ctx */) = 0;
                 ^
src/snmp_trap.hpp:65:10: note: Function in derived class
    void operator()(Context /* ctx */)
         ^
src/snmp_trap.hpp:72:10: style: The function 'operator()' overrides a function in a base class but is not marked with a 'override' specifier. [missingOverride]
    void operator()(Context /* ctx */, sdbusplus::message::message& msg)
         ^
src/callback.hpp:50:18: note: Virtual function in base class
    virtual void operator()(Context /* ctx */,
                 ^
src/snmp_trap.hpp:72:10: note: Function in derived class
    void operator()(Context /* ctx */, sdbusplus::message::message& msg)
         ^
src/snmp_trap.cpp:44:17: style: Consider using std::accumulate algorithm instead of a raw loop. [useStlAlgorithm]
        message += " " + s;
                ^
src/test/pathgentest.cpp:118:21: style: Local variable 'meta' shadows outer variable [shadowVariable]
        const auto& meta = std::get<1>(pathMeta[i]).get();
                    ^
src/test/pathgentest.hpp:1:34: note: Shadowed declaration
const std::array<std::string, 3> meta = {
                                 ^
src/test/pathgentest.cpp:118:21: note: Shadow variable
        const auto& meta = std::get<1>(pathMeta[i]).get();
                    ^
src/test/propertygentest.cpp:133:25: style: Local variable 'expectedMeta' shadows outer variable [shadowVariable]
            const auto& expectedMeta = std::get<1>(expectedGroups[i][j]).get();
                        ^
src/test/propertygentest.cpp:17:34: note: Shadowed declaration
const std::array<std::string, 3> expectedMeta = {
                                 ^
src/test/propertygentest.cpp:133:25: note: Shadow variable
            const auto& expectedMeta = std::get<1>(expectedGroups[i][j]).get();
                        ^
src/test/propertywatchtest.cpp:263:21: style: Local variable 'interfaces' shadows outer variable [shadowVariable]
        const auto& interfaces = o.second;
                    ^
src/test/propertywatchtest.cpp:18:34: note: Shadowed declaration
const std::array<std::string, 2> interfaces = {
                                 ^
src/test/propertywatchtest.cpp:263:21: note: Shadow variable
        const auto& interfaces = o.second;
                    ^
src/test/propertywatchtest.cpp:280:25: style: Local variable 'properties' shadows outer variable [shadowVariable]
            const auto& properties = i.second;
                        ^
src/test/propertywatchtest.cpp:23:34: note: Shadowed declaration
const std::array<std::string, 2> properties = {
                                 ^
src/test/propertywatchtest.cpp:280:25: note: Shadow variable
            const auto& properties = i.second;
                        ^

Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: Ica5d54cefe22fed961f01aa6288b4cf76a9db563
