tree 6b197047691586ee98dc9b046aafd1b133658080
parent b754cf02ecee5ebdadbd3253c21caae04599412e
author Andrew Jeffery <andrew@aj.id.au> 1675655377 +1030
committer Andrew Jeffery <andrew@aj.id.au> 1675750948 +1030

controller: Work around clang-tidy issue with boost

See https://bugs.llvm.org/show_bug.cgi?id=41141

```
../subprojects/boost_1_81_0/boost/algorithm/string/detail/classification.hpp:137:25: error: Potential memory leak [clang-analyzer-cplusplus.NewDeleteLeaks,-warnings-as-errors]
                    if(!use_fixed_storage(m_Size) && m_Storage.m_dynSet!=0)
                        ^
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../controller.cpp:100:9: note: Assuming the condition is false
    if (options["path"].empty())
        ^~~~~~~~~~~~~~~~~~~~~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../controller.cpp:100:5: note: Taking false branch
    if (options["path"].empty())
    ^
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../controller.cpp:135:5: note: Calling 'getLedDescr'
    getLedDescr(name, ledDescr);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../controller.cpp:56:5: note: Calling 'split<std::vector<std::basic_string<char>>, const std::basic_string<char> &, boost::algorithm::detail::is_any_ofF<char>>'
    boost::split(words, name, boost::is_any_of(":"));
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/split.hpp:161:17: note: Calling 'token_finder<boost::algorithm::detail::is_any_ofF<char>>'
                ::boost::algorithm::token_finder( Pred, eCompress ) );
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/finder.hpp:219:20: note: Calling constructor for 'token_finderF<boost::algorithm::detail::is_any_ofF<char>>'
            return detail::token_finderF<PredicateT>( Pred, eCompress );
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/detail/finder.hpp:554:25: note: Calling copy constructor for 'is_any_ofF<char>'
                        m_Pred(Pred), m_eCompress(eCompress) {}
                        ^~~~~~~~~~~~
../subprojects/boost_1_81_0/boost/algorithm/string/detail/classification.hpp:116:21: note: Taking false branch
                    if(use_fixed_storage(m_Size))
                    ^
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/detail/classification.hpp:125:44: note: Memory is allocated
                        m_Storage.m_dynSet=new set_value_type[m_Size];
                                           ^~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/detail/finder.hpp:554:25: note: Returning from copy constructor for 'is_any_ofF<char>'
                        m_Pred(Pred), m_eCompress(eCompress) {}
                        ^~~~~~~~~~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/finder.hpp:219:20: note: Returning from constructor for 'token_finderF<boost::algorithm::detail::is_any_ofF<char>>'
            return detail::token_finderF<PredicateT>( Pred, eCompress );
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/split.hpp:161:17: note: Returned allocated memory
                ::boost::algorithm::token_finder( Pred, eCompress ) );
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/split.hpp:161:51: note: Calling '~is_any_ofF'
                ::boost::algorithm::token_finder( Pred, eCompress ) );
                                                  ^
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/detail/classification.hpp:137:25: note: Potential memory leak
                    if(!use_fixed_storage(m_Size) && m_Storage.m_dynSet!=0)
                        ^
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/detail/classification.hpp:141:17: error: Potential memory leak [clang-an
alyzer-cplusplus.NewDeleteLeaks,-warnings-as-errors]
                }
                ^
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../controller.cpp:100:9: note: Assuming the condition is false
    if (options["path"].empty())
        ^~~~~~~~~~~~~~~~~~~~~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../controller.cpp:100:5: note: Taking false branch
    if (options["path"].empty())
    ^
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../controller.cpp:135:5: note: Calling 'getLedDescr'
    getLedDescr(name, ledDescr);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../controller.cpp:56:5: note: Calling 'split<std::vector<std::basic_string<char>>, const std::basic_string<char> &, boost::algorithm::detail::is_any_ofF<char>>'
    boost::split(words, name, boost::is_any_of(":"));
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/split.hpp:161:17: note: Calling 'token_finder<boost::algorithm::detail::is_any_ofF<char>>'
                ::boost::algorithm::token_finder( Pred, eCompress ) );
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/finder.hpp:219:55: note: Calling copy constructor for 'is_any_ofF<char>'
            return detail::token_finderF<PredicateT>( Pred, eCompress );
                                                      ^~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/detail/classification.hpp:116:21: note: Taking false branch
                    if(use_fixed_storage(m_Size))
                    ^
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/detail/classification.hpp:125:44: note: Memory is allocated
                        m_Storage.m_dynSet=new set_value_type[m_Size];
                                           ^~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/finder.hpp:219:55: note: Returning from copy constructor for 'is_any_ofF<char>'
            return detail::token_finderF<PredicateT>( Pred, eCompress );
                                                      ^~~~
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/finder.hpp:219:55: note: Calling '~is_any_ofF'
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/detail/classification.hpp:137:51: note: Left side of '&&' is false
                    if(!use_fixed_storage(m_Size) && m_Storage.m_dynSet!=0)
                                                  ^
/home/andrew/src/openbmc/phosphor-led-sysfs/build/../subprojects/boost_1_81_0/boost/algorithm/string/detail/classification.hpp:141:17: note: Potential memory leak
                }
                ^
138378 warnings generated.
```

Change-Id: Ie7e36805f91971f6057ea1e6e143fcf4dffcac65
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
