
éåœã®ã²ããã«ãã£ãŠããAwesomehppãã³ã¬ã¯ã·ã§ã³ã®ã»ãšãã©ã®ã©ã€ãã©ãªããã§ãã¯ããŸããããããã¯ãããããŒãã¡ã€ã«ã®ã¿ã§æ§æãããå°ããªC ++ãããžã§ã¯ãã§ããããŸãããã°ãèŠã€ãã£ããã°ããããã®ã©ã€ãã©ãªãå°ãè¯ãããã®ã«åœ¹ç«ã€ã§ãããããŸããèè ã宿çã«PVS-Studioã¢ãã©ã€ã¶ãŒãç¡æã§äœ¿ãå§ããŠããã ããã°å¹žãã§ãã
awesome-hppïŒçŽ æŽãããããããŒã®ã¿ã®C ++ã©ã€ãã©ãªã®ãã¥ã¬ãŒãããããªã¹ãïŒãªã¹ãã«ãªã¹ã ãããŠããããŸããŸãªã©ã€ãã©ãªããã¹ãããçµæã®æŠèŠã«æ³šç®ããŸãã
ãã®ãªã¹ãã«ã€ããŠã¯ããCross PlatformMobileTelephonyãããããã£ã¹ãããæåã«ç¥ããŸããããã®æ©äŒãå©çšããŠããã¹ãŠã®C ++ããã°ã©ããŒã«CppCastã«ç²Ÿéããããšããå§ãããŸããCppCastã¯ãC ++éçºè ã«ããC ++éçºè åãã®æåã®ããããã£ã¹ãã§ãã
ãªã¹ãã«ã¯å€æ°ã®ãããžã§ã¯ãããããŸããããšã©ãŒã¯ã»ãšãã©ãããŸããã§ãããããã«ã¯3ã€ã®çç±ããããŸãã
- ãããã¯éåžžã«å°ããªãããžã§ã¯ãã§ããå€ãã¯æåéãåäžã®ããããŒãã¡ã€ã«ã§æ§æãããŠããŸãã
- ãã¹ãŠã®ãããžã§ã¯ãããã§ãã¯ããããã§ã¯ãããŸããããããã®ããã€ãã®ã³ã³ãã€ã«ã«åé¡ããããç§ãã¡ã¯ããããã¹ãããããããšã«ããŸããã
- å€ãã®å Žåããã³ãã¬ãŒãã¯ã©ã¹/颿°ã«ãšã©ãŒããããã©ãããçè§£ããããã«ãããããã€ã³ã¹ã¿ã³ã¹åããå¿ èŠããããŸãããããã£ãŠãã©ã€ãã©ãªãã¢ã¯ãã£ãã«äœ¿çšãããŠããå Žåãå®éã®ãããžã§ã¯ãã§ã®ã¿ã¢ãã©ã€ã¶ã«ãã£ãŠå€ãã®ãšã©ãŒãæ€åºã§ããŸãã空ã®.cppãã¡ã€ã«ã«ããããŒãã¡ã€ã«ãå«ããŠãã§ãã¯ããã ããªã®ã§ããã§ãã¯ãç¡å¹ã«ãªããŸãã
ããã«ãããããããããããç ç©¶ããéçšã§ããã®èšäºãšããã€ãã®è¿œå ã®èšäºãæžãã®ã«ååãªèŠåããããŸããã
ååãžã®ã¡ã¢
, - . . awesome-hpp, :
- , C++11, C++14 C++17;
- " , ";
- " â , ";
- ;
- (. CSV Parser);
- , . â , - :);
- , .
ã©ã€ãã©ãªéçºè ãžã®ã¡ã¢ãèå³ã®ããæ¹ã¯ãPVS-Studioã¢ãã©ã€ã¶ãŒãç¡æã§äœ¿çšããŠãªãŒãã³ãœãŒã¹ãããžã§ã¯ãããã§ãã¯ã§ããŸãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®ã©ã€ã»ã³ã¹ãååŸããã«ã¯ããã®ãã©ãŒã ã«èšå ¥ããŠãã ããã
æåŸã«ãããã€ãã®ã©ã€ãã©ãªã§èŠã€ãã£ããã®ãèŠãŠã¿ãŸãããã
èŠã€ãã£ããšã©ãŒ
Iutestã©ã€ãã©ãª
iutest ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
iutestã¯ãC ++ãã¹ããäœæããããã®ãã¬ãŒã ã¯ãŒã¯ã§ãã
template<typename Event>
pool_handler<Event> & assure() {
....
return static_cast<pool_handler<Event> &>(it == pools.cend() ?
*pools.emplace_back(new pool_handler<Event>{}) : **it);
....
}
PVS-StudioèŠåïŒV1023ææè ã®ãªããã€ã³ã¿ãŒããemplace_backãã¡ãœããã«ãã£ãŠãããŒã«ãã³ã³ãããŒã«è¿œå ãããŸããäŸå€ãçºçããå Žåãã¡ã¢ãªãªãŒã¯ãçºçããŸããentt.hpp 17114
ãã®ã³ãŒãã¯ãã¡ã¢ãªããªãŒã¯ããå¯èœæ§ããããŸããã³ã³ãããåå²ãåœãŠãå¿ èŠãšããæ°ããé åã«ã¡ã¢ãªãå²ãåœãŠãããšãã§ããªãå ŽåãäŸå€ãã¹ããŒããããã€ã³ã¿ã倱ãããŸãã
ããããããã¹ãã®å Žåããã®ç¶æ³ã¯èµ·ããããã«ãªããé倧ã§ã¯ãããŸãããããããç§ã¯æè²ç®çã§ãã®æ¬ ç¹ã«èšåããããšã«ããŸãã:)ã
æ£ãããªãã·ã§ã³ïŒ
pools.emplace_back(std::make_unique<pool_handler<Event>>{})
å¥ã®åæ§ã®å ŽæïŒV1023ææè ã®ãªããã€ã³ã¿ãŒããemplace_backãã¡ãœããã«ãã£ãŠãpoolsãã³ã³ãããŒã«è¿œå ãããŸããäŸå€ãçºçããå Žåãã¡ã¢ãªãªãŒã¯ãçºçããŸããentt.hpp 17407
Jsonconsã©ã€ãã©ãª
jsoncons ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
JSONãã€ã³ã¿ãJSONããããJSONPathãJMESPathãCSVãMessagePackãCBORãBSONãUBJSONã䜿çšããŠãJSONããã³JSONã®ãããªããŒã¿åœ¢åŒãæ§ç¯ããããã®C ++ããããŒã®ã¿ã®ã©ã€ãã©ãªãæåã®ééã
static constexpr uint64_t basic_type_bits = sizeof(uint64_t) * 8;
uint64_t* data()
{
return is_dynamic() ? dynamic_stor_.data_ : short_stor_.values_;
}
basic_bigint& operator<<=( uint64_t k )
{
size_type q = (size_type)(k / basic_type_bits);
....
if ( k ) // 0 < k < basic_type_bits:
{
uint64_t k1 = basic_type_bits - k;
uint64_t mask = (1 << k) - 1; // <=
....
data()[i] |= (data()[i-1] >> k1) & mask;
....
}
reduce();
return *this;
}
PVS-Studioã®èŠåïŒV629ã1 << kãåŒã®æ€æ»ãæ€èšããŠãã ããã32ãããå€ã®ãããã·ãããšããã«ç¶ã64ãããã¿ã€ããžã®æ¡åŒµãbigint.hpp 744
ãã®ãšã©ãŒã«ã€ããŠã¯ãããããžã§ã¯ãã«è¿œå ãããªãŒãã³ãœãŒã¹ã©ã€ãã©ãªã®éçåæãå®è¡ããããšãéèŠã§ããçç±ãã®èšäºã§ãã§ã«è©³ãã説æãããŠããŸããã€ãŸããæ£ãããã¹ã¯å€ãååŸããã«ã¯ã次ã®ããã«èšè¿°ããå¿ èŠããããŸãã
uint64_t mask = (static_cast<uint64_t>(1) << k) - 1;
ãŸãã¯ãã®ããã«ïŒ
uint64_t mask = (1ull << k) - 1;
æåã®ãšã©ãŒãšãŸã£ããåããšã©ãŒãããã«è¡šç€ºãããŸããV629ã1 << kãåŒã®æ€æ»ãæ€èšããŠãã ããã32ãããå€ã®ãããã·ãããšããã«ç¶ã64ãããã¿ã€ããžã®æ¡åŒµãbigint.hpp 7792
çªç®ã®ãšã©ãŒ
template <class CharT = typename std::iterator_traits<Iterator>::value_type>
typename std::enable_if<sizeof(CharT) == sizeof(uint16_t)>::type
next() UNICONS_NOEXCEPT
{
begin_ += length_;
if (begin_ != last_)
{
if (begin_ != last_)
{
....
}
PVS-Studioã®èŠåïŒV571宿çãªãã§ãã¯ã'ifïŒbegin _ïŒ= Last_ïŒ'æ¡ä»¶ã¯ã1138è¡ç®ã§ãã§ã«æ€èšŒãããŠããŸããunicode_traits.hpp1140
å¥åŠãªåãã¹ããããã«ããã€ãã®ã¿ã€ããã¹ãããã2çªç®ã®æ¡ä»¶ã¯äœãéãããã«èŠããã¯ãã§ãããšããçãããããŸãã
Clippã©ã€ãã©ãª
clipp ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
clipp-ææ°ã®C ++ã®ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ãåäžã®ããããŒãã¡ã€ã«ã«å«ãŸããC ++ 11/14/17ã®äœ¿ããããã匷åã§è¡šçŸåè±ããªã³ãã³ãã©ã€ã³åŒæ°åŠçã
inline bool
fwd_to_unsigned_int(const char*& s)
{
if(!s) return false;
for(; std::isspace(*s); ++s);
if(!s[0] || s[0] == '-') return false;
if(s[0] == '-') return false;
return true;
}
PVS-Studioã®èŠåïŒV547åŒã®[0] == '-' 'ã¯åžžã«falseã§ããclipp.h 303
å®ã¯ãããã¯ãšã©ãŒã§ã¯ãªããåã«åé·ãªã³ãŒãã§ãããã€ãã¹ãã§ãã¯ã¯2åå®è¡ãããŸãã
SimpleIniã©ã€ãã©ãª
SimpleIni ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
INIã¹ã¿ã€ã«ã®æ§æãã¡ã€ã«ãèªã¿æžãããããã®ã·ã³ãã«ãªAPIãæäŸããã¯ãã¹ãã©ãããã©ãŒã ã©ã€ãã©ãªãASCIIãMBCSãUnicodeã®ããŒã¿ãã¡ã€ã«ããµããŒãããŠããŸãã
#if defined(SI_NO_MBSTOWCS_NULL) || (!defined(_MSC_VER) && !defined(_linux))
PVS-Studioã®èŠåïŒV1040äºåå®çŸ©ããããã¯ãåã®ã¹ãã«ã«ã¿ã€ããã¹ãããå¯èœæ§ããããŸãã'_linux'ãã¯ã㯠'__linux'ã«äŒŒãŠããŸããSimpleIni.h 2923ã¯ã
ã»ãšãã©ã®å Žåãã®åå_linuxã®ãã¯ãã¯1ã¢ã³ããŒã¹ã³ã¢ãæ¬ èœããŠãããšåå__linuxã䜿çšããå¿ èŠããããŸãããã ããPOSIXã§ã¯ããã®ãã¯ãã¯éæšå¥šã§ããã__ linux__ã䜿çšããããšããå§ãããŸãã
CSVããŒãµãŒã©ã€ãã©ãª
CSVããŒãµãŒ ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
CSVïŒããã³åæ§ã®ïŒãã¡ã€ã«ãèªã¿åããæžã蟌ã¿ãåæããããã®ææ°ã®C ++ã©ã€ãã©ãªã
CSV_INLINE void CSVReader::read_csv(const size_t& bytes) {
const size_t BUFFER_UPPER_LIMIT = std::min(bytes, (size_t)1000000);
std::unique_ptr<char[]> buffer(new char[BUFFER_UPPER_LIMIT]);
auto * HEDLEY_RESTRICT line_buffer = buffer.get();
line_buffer[0] = '\0';
....
this->feed_state->feed_buffer.push_back(
std::make_pair<>(std::move(buffer), line_buffer - buffer.get())); // <=
....
}
PVS-Studioã®èŠåïŒV769'line_buffer --buffer.getïŒïŒ 'åŒã®' buffer.getïŒïŒ 'ãã€ã³ã¿ãŒãnullptrã«çãããçµæã®å€ã¯ç¡æå³ã§ããã䜿çšããªãã§ãã ãããcsv.hpp4957
æ éã«æ€èšããå¿ èŠãããè峿·±ãç¶æ³ããããã£ãŠãç§ã¯ããã«ã€ããŠå¥ã®å°ããªã¡ã¢ãæžãããšã«ããŸãããããã«ãåæ§ã®ã³ãŒãã詊ããŠãããšãã«ãPVS-Studioèªäœã«æ¬ é¥ãèŠã€ãããŸãã:)ãèŠåãçºããã¯ãã§ããããµã€ã¬ã³ããªå ŽåããããŸãã
ã€ãŸãããã®ã³ãŒããæ©èœãããã©ããã¯ãåŒæ°ãè©äŸ¡ãããé åºã«ãã£ãŠç°ãªããŸããåŒæ°ãè©äŸ¡ãããé åºã¯ãã³ã³ãã€ã©ã«ãã£ãŠç°ãªããŸãã
PPrintã©ã€ãã©ãª
ã©ã€ãã©ãªPPRINTã®ç°¡åãªèª¬æïŒã
çŸä»£ã®C ++çšã®ããããªããªã³ã¿ãŒã
template <typename Container>
typename std::enable_if<......>::type print_internal(......) {
....
for (size_t i = 1; i < value.size() - 1; i++) {
print_internal(value[i], indent + indent_, "", level + 1);
if (is_container<T>::value == false)
print_internal_without_quotes(", ", 0, "\n");
else
print_internal_without_quotes(", ", 0, "\n");
}
....
}
PVS-StudioèŠåïŒV523ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ããpprint.hpp715
æ¡ä»¶ã«é¢ä¿ãªãåãã¢ã¯ã·ã§ã³ãå®è¡ãããã®ã¯éåžžã«å¥åŠã§ããç¹å¥ãªè§£èª¬ããããŸãããããã¯ãã¹ãŠãã³ããŒãšè²Œãä»ãã®ãšã©ãŒãšéåžžã«ãã䌌ãŠããŸãã
åæ§ã®èŠåïŒ
- V523ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ããpprint.hpp 780
- V523ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ããpprint.hpp 851
- V523ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ããpprint.hpp 927
- V523ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ããpprint.hpp 1012
Strfã©ã€ãã©ãª
Strf ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
ãšã³ã³ãŒãã£ã³ã°å€æããµããŒãããé«éC ++ãã©ãŒãããã©ã€ãã©ãªãæåã®ééã
template <int Base>
class numpunct: private strf::digits_grouping
{
....
constexpr STRF_HD numpunct& operator=(const numpunct& other) noexcept
{
strf::digits_grouping::operator=(other);
decimal_point_ = other.decimal_point_;
thousands_sep_ = other.thousands_sep_;
}
....
};
PVS-StudioèŠåïŒV591évoid颿°ã¯å€ãè¿ãå¿ èŠããããŸããnumpunct.hpp402
颿°ã®æåŸã«ãreturn * this;ããšæžãã®ãå¿ããŸããã
2çªç®ã®åæ§ã®ãšã©ãŒ
template <int Base>
class no_grouping final
{
constexpr STRF_HD no_grouping& operator=(const no_grouping& other) noexcept
{
decimal_point_ = other.decimal_point_;
}
....
}
PVS-StudioèŠåïŒV591évoid颿°ã¯å€ãè¿ãå¿ èŠããããŸããnumpunct.hpp528ã
ã€ã³ãžã±ãŒã¿ãŒã©ã€ãã©ãª
ã€ã³ãžã±ãŒã¿ãŒ ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
ææ°ã®C ++ã®ã¢ã¯ãã£ããã£ã€ã³ãžã±ãŒã¿ãŒã
static inline void move_up(int lines) { move(0, -lines); }
static inline void move_down(int lines) { move(0, -lines); } // <=
static inline void move_right(int cols) { move(cols, 0); }
static inline void move_left(int cols) { move(-cols, 0); }
PVS-StudioèŠåïŒV524ãmove_downã颿°ã®æ¬äœããmove_upã颿°ã®æ¬äœãšå®å šã«åçã§ããã®ã¯å¥åŠã§ããIndicators.hpp983
ããããã°ãã©ããã¯ããããŸãããããããã³ãŒãã¯éåžžã«çãããã§ããmove_up颿°ãã³ããŒããããã®ååãmove_downã«å€æŽãããå¯èœæ§ããããŸãããããã圌ãã¯ãã€ãã¹ãåãé€ãã®ãå¿ããŠããŸããããã®ã³ãŒãããã§ãã¯ãã䟡å€ããããŸãã
泚æãã³ãŒããæ£ããå Žåã¯ãã³ãŒãã¢ãã©ã€ã¶ãŒã ãã§ãªãããã®ã³ãŒãã䜿çšãŸãã¯éçºããããµãŒãããŒãã£ã®ããã°ã©ããŒã«ã誀解ãäžããããšãçè§£ããå¿ èŠããããŸãããã®ã³ãŒãã«ã³ã¡ã³ãã远å ãããšäŸ¿å©ã§ãã
ãããã©ã€ãã©ãª
ããã ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
manifã¯ãããããå·¥åŠã¢ããªã±ãŒã·ã§ã³ã察象ãšããç¶æ æšå®çšã®ããããŒã®ã¿ã®C ++ 11Lieçè«ã©ã€ãã©ãªã§ãã
template <typename _Derived>
typename LieGroupBase<_Derived>::Scalar*
LieGroupBase<_Derived>::data()
{
return derived().coeffs().data();
}
template <typename _Derived>
const typename LieGroupBase<_Derived>::Scalar*
LieGroupBase<_Derived>::data() const
{
derived().coeffs().data(); // <=
}
PVS-StudioèŠåïŒV591évoid颿°ã¯å€ãè¿ãå¿ èŠããããŸããlie_group_base.h 347
é宿°é¢æ°ã¯æ£ããå®è£ ãããŠããŸããã宿°é¢æ°ã¯æ£ããå®è£ ãããŠããŸããããããã©ã®ããã«èµ·ãã£ããã¯ããã«è峿·±ãã§ã...
FakeItã©ã€ãã©ãª
FakeIt ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
FakeItã¯ãC ++çšã®åçŽãªã¢ãã¯ãã¬ãŒã ã¯ãŒã¯ã§ããGCCãClangãMS Visual C ++ããµããŒãããŠããŸããFakeItã¯C ++ 11ã§èšè¿°ãããŠãããC ++ 11ãããžã§ã¯ããšC ++ãããžã§ã¯ãã®äž¡æ¹ã®ãã¹ãã«äœ¿çšã§ããŸãã
template<typename ... arglist>
struct ArgumentsMatcherInvocationMatcher :
public ActualInvocation<arglist...>::Matcher {
....
template<typename A>
void operator()(int index, A &actualArg) {
TypedMatcher<typename naked_type<A>::type> *matcher =
dynamic_cast<TypedMatcher<typename naked_type<A>::type> *>(
_matchers[index]);
if (_matching)
_matching = matcher->matches(actualArg);
}
....
const std::vector<Destructible *> _matchers;
};
PVS-StudioèŠåïŒV522æœåšçãªãã«ãã€ã³ã¿ãŒããããã£ãŒãã®éåç §ãããå¯èœæ§ããããŸããfakeit.hpp 6720ãããã£ãŒ
ãã€ã³ã¿ã¯ãdynamic_castæŒç®åã«ãã£ãŠè¿ãããå€ã§åæåãããŸãããããŠããã®æŒç®åã¯nullptrãè¿ãå¯èœæ§ããããããã¯éåžžã«ãããããªã·ããªãªã§ãããã以å€ã®å Žåã¯ãdynamic_castã®ä»£ããã«static_castã䜿çšããæ¹ãå¹ççã§ãã
ç¶æ ã«ã¿ã€ããã¹ãããçãããããå®éã«ã¯æ¬¡ã®ããã«æžãå¿ èŠããããŸãã
if (matcher)
_matching = matcher->matches(actualArg);
GuiLiteã©ã€ãã©ãª
GuiLite ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
ãã¹ãŠã®ãã©ãããã©ãŒã çšã®æå°ã®ããããŒã®ã¿ã®GUIã©ã€ãã©ãªïŒ4 KLOCïŒã
#define CORRECT(x, high_limit, low_limit) {\
x = (x > high_limit) ? high_limit : x;\
x = (x < low_limit) ? low_limit : x;\
}while(0)
void refresh_wave(unsigned char frame)
{
....
CORRECT(y_min, m_wave_bottom, m_wave_top);
....
}
PVS-StudioèŠåïŒV529奿°ã»ãã³ãã³ ';' 'while'æŒç®åã®åŸã GuiLite.h 3413
ãã¯ãã®ãšã©ãŒã¯ãåé¡ãåŒãèµ·ãããŸãããããããããã§ãééããªã®ã§ãèšäºã§èª¬æããããšã«ããŸããã
ãã¯ãã§ïŒ....ïŒãªãããå€å žçãªãã¿ãŒã³do {...}ã䜿çšããããšãèšç»ãããŠããŸãããããã«ããã1ã€ã®ãããã¯ã§è€æ°ã®ã¢ã¯ã·ã§ã³ãå®è¡ãããšåæã«ã颿°åŒã³åºãã§ãããã®ããã«ãçŸããã®ããã«ãã¯ãã®åŸã«ã»ãã³ãã³ ';'ãæžã蟌ãããšãã§ããŸãã
ããããæ€èšå¯Ÿè±¡ã®ãã¯ãã§ã¯ã誀ã£ãŠdoããŒã¯ãŒããæžãã®ãå¿ããŠããŸããããã®çµæããã¯ãã¯ãããã°2ã€ã®éšåã«åå²ãããŸããæåã¯ãããã¯ã§ãã 2ã€ç®ã¯ã空ã®éå®è¡ã«ãŒãã§ããwhileïŒ0ïŒ; ..ã
ãããŠãåé¡ã¯äœã§ããïŒ
ããšãã°ããã®ãããªãã¯ãã¯ã次ã®ãããªæ§é ã§ã¯äœ¿çšã§ããŸããã
if (A)
CORRECT(y_min, m_wave_bottom, m_wave_top);
else
Foo();
ãã®ã³ãŒãã¯æ¬¡ã®ããã«å±éããããããã³ã³ãã€ã«ãããŸããã
if (A)
{ ..... }
while(0);
else
Foo();
åæããŸãããã®ãããªåé¡ã¯ãäœ¿çšæ®µéã§ã¯ãªããã©ã€ãã©ãªéçºã®æ®µéã§èŠã€ããŠä¿®æ£ããããšããå§ãããŸããéçã³ãŒãåæãé©çšããŸã:)ã

PpluXã©ã€ãã©ãª
PpluX ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
ã¹ã¬ããã®ã¹ã±ãžã¥ãŒãªã³ã°ãã¬ã³ããªã³ã°ãªã©ã®ããã®åäžããããŒC ++ã©ã€ãã©ãª..ã
struct DisplayList {
DisplayList& operator=(DisplayList &&d) {
data_ = d.data_;
d.data_ = nullptr;
}
....
}
PVS-StudioèŠåïŒV591évoid颿°ã¯å€ãè¿ãå¿ èŠããããŸããpx_render.h 398
ãŠãããŒãµã«ã©ã€ãã©ãª
ãŠãããŒãµã«ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
Universal NumbersïŒunumsïŒã®ç®æšã¯ãIEEEãããŒãã£ã³ã°ãã€ã³ãããåæå®è¡ç°å¢ã§ããå¹ççã§æ°åŠçã«äžè²«æ§ã®ããæ°å€ã·ã¹ãã ã«çœ®ãæããããšã§ããæåã®ééã
template<typename Scalar>
vector<Scalar> operator*(double scalar, const vector<Scalar>& v) {
vector<Scalar> scaledVector(v);
scaledVector *= scalar;
return v;
}
PVS-StudioèŠåïŒV1001'scaledVector '倿°ãå²ãåœãŠãããŠããŸããã颿°ã®æåŸã§ã¯äœ¿çšãããŠããŸãããvector.hpp124ã¿ã€ããã¹
ãå ã®ãã¯ãã«vã®ä»£ããã«ã颿°ã¯æ°ãããã¯ãã«ãscaledVectorãè¿ãå¿ èŠããããŸãã
åæ§ã®ã¿ã€ããã¹ãããã«èŠãããŸãïŒV1001'normalizedVector '倿°ãå²ãåœãŠãããŠããŸããã颿°ã®çµããã§ã¯äœ¿çšãããŠããŸãããvector.hpp 1312
çªç®ã®ãšã©ãŒ
template<typename Scalar>
class matrix {
....
matrix& diagonal() {
}
....
};
PVS-StudioèŠåïŒV591évoid颿°ã¯å€ãè¿ãå¿ èŠããããŸããmatrix.hpp 1093
çªç®ã®ãšã©ãŒ
template<size_t fbits, size_t abits>
void module_subtract_BROKEN(
const value<fbits>& lhs, const value<fbits>& rhs, value<abits + 1>& result)
{
if (lhs.isinf() || rhs.isinf()) {
result.setinf();
return;
}
int lhs_scale = lhs.scale(),
rhs_scale = rhs.scale(),
scale_of_result = std::max(lhs_scale, rhs_scale);
// align the fractions
bitblock<abits> r1 =
lhs.template nshift<abits>(lhs_scale - scale_of_result + 3);
bitblock<abits> r2 =
rhs.template nshift<abits>(rhs_scale - scale_of_result + 3);
bool r1_sign = lhs.sign(), r2_sign = rhs.sign();
//bool signs_are_equal = r1_sign == r2_sign;
if (r1_sign) r1 = twos_complement(r1);
if (r1_sign) r2 = twos_complement(r2); // <=
....
}
PVS-StudioèŠåïŒV581äºãã«äžŠãã§é 眮ãããŠãããifãã¹ããŒãã¡ã³ãã®æ¡ä»¶åŒã¯åãã§ãããã§ãã¯è¡ïŒ789ã790ãvalue.hpp790
ã³ããŒã¢ã³ãããŒã¹ãã«ãã£ãŠåŒãèµ·ããããå€å žçãªãšã©ãŒã圌ãã¯æ¬¡ã®è¡ãåããä¹ç®ããŸããã
if (r1_sign) r1 = twos_complement(r1);
ãã®äžã§r1ãr2ã«å€æŽããŸããïŒ
if (r1_sign) r2 = twos_complement(r2);
ãããŠã圌ãã¯r1_signã倿Žããã®ãå¿ããŠããŸãããæ£ãããªãã·ã§ã³ïŒ
if (r2_sign) r2 = twos_complement(r2);
Choboã·ã³ã°ã«ããããŒã©ã€ãã©ãª
Choboã·ã³ã°ã«ããããŒã©ã€ãã©ãªã® ç°¡åãªèª¬æïŒ
Chobolabsã«ããå°ããªã·ã³ã°ã«ããããŒC ++ 11ã©ã€ãã©ãªã®ã³ã¬ã¯ã·ã§ã³ãæåã®ééã
template <typename T, typename U, typename Alloc = std::allocator<T>>
class vector_view
{
....
vector_view& operator=(vector_view&& other)
{
m_vector = std::move(other.m_vector);
}
....
}
PVS-StudioèŠåïŒV591évoid颿°ã¯å€ãè¿ãå¿ èŠããããŸããvector_view.hpp 1632
çªç®ã®ãšã©ãŒ
template <typename UAlloc>
vector_view& operator=(const std::vector<U, UAlloc>& other)
{
size_type n = other.size();
resize(n);
for (size_type i = 0; i < n; ++i)
{
this->at(i) = other[i];
}
}
PVS-StudioèŠåïŒV591évoid颿°ã¯å€ãè¿ãå¿ èŠããããŸããvector_view.hpp 184
ã©ã€ãã©ãªPGM-ã€ã³ããã¯ã¹
PGMã€ã³ããã¯ã¹ ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
Piecewise Geometric Modelã€ã³ããã¯ã¹ïŒPGM-indexïŒã¯ãåŸæ¥ã®ã€ã³ããã¯ã¹ãããæ°æ¡å°ãªãã¹ããŒã¹ã䜿çšããŠãåãææªã®å Žåã®ã¯ãšãªæéã®ä¿èšŒãæäŸããªãããæ°ååã®ã¢ã€ãã ã®é åã§é«éã«ãã¯ã¢ãããå è¡ãç¯å²æ€çŽ¢ãããã³æŽæ°ãå¯èœã«ããããŒã¿æ§é ã§ã..ãæåã®ééã
char* str_from_errno()
{
#ifdef MSVC_COMPILER
#pragma warning(disable:4996)
return strerror(errno);
#pragma warning(default:4996)
#else
return strerror(errno);
#endif
}
PVS-StudioèŠåïŒV665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragmaèŠåïŒããã©ã«ãïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã代ããã«ããïŒpragmaèŠåïŒããã·ã¥/ãããïŒãã䜿çšããå¿ èŠããããŸãããã§ãã¯è¡ïŒ9170ã9172ãsdsl.hpp9172
ã³ã³ãã€ã©ã®èŠåãäžæçã«ç¡å¹ã«ããã®ãæ£ãããããŸããããã®ãããªäžæ£ç¢ºãã¯ããŠãŒã¶ãŒã³ãŒãã«ã¯ã©ããããããèš±ãããŸãããã ããããã¯ããããŒã®ã¿ã®ã©ã€ãã©ãªã§ã¯çµ¶å¯Ÿã«èš±å¯ãããŠããŸããã
2çªç®ã®ééã
template<class t_int_vec>
t_int_vec rnd_positions(uint8_t log_s, uint64_t& mask,
uint64_t mod=0, uint64_t seed=17)
{
mask = (1<<log_s)-1; // <=
t_int_vec rands(1<<log_s ,0);
set_random_bits(rands, seed);
if (mod > 0) {
util::mod(rands, mod);
}
return rands;
}
PVS-Studioã®èŠåïŒV629ã1 << log_sãåŒã®æ€æ»ãæ€èšããŠãã ããã32ãããå€ã®ãããã·ãããšããã«ç¶ã64ãããã¿ã€ããžã®æ¡åŒµãsdsl.hpp 1350
æ£ãããªãã·ã§ã³ã®1ã€ïŒ
mask = ((uint64_t)(1)<<log_s)-1;
Hnswlibã©ã€ãã©ãª
Hnswlib ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
Pythonãã€ã³ãã£ã³ã°ã䜿çšããããããŒã®ã¿ã®C ++ HNSWå®è£ ãHNSW 200MSIFTå®éšçšã®çŽã®ã³ãŒãã
template<typename dist_t>
class BruteforceSearch : public AlgorithmInterface<dist_t> {
public:
BruteforceSearch(SpaceInterface <dist_t> *s, size_t maxElements) {
maxelements_ = maxElements;
data_size_ = s->get_data_size();
fstdistfunc_ = s->get_dist_func();
dist_func_param_ = s->get_dist_func_param();
size_per_element_ = data_size_ + sizeof(labeltype);
data_ = (char *) malloc(maxElements * size_per_element_);
if (data_ == nullptr)
std::runtime_error(
"Not enough memory: BruteforceSearch failed to allocate data");
cur_element_count = 0;
}
....
}
PVS-StudioèŠåïŒV596ãªããžã§ã¯ãã¯äœæãããŸãããã䜿çšãããŠããŸããã'throw'ããŒã¯ãŒããæ¬ èœããŠããå¯èœæ§ããããŸãïŒthrow runtime_errorïŒFOOïŒ; bruteforce.h 26 std :: runtime_errorã®
åã«throwã¹ããŒãã¡ã³ããæžãã®ãå¿ããŸããã å¥ã®ãã®ãããªãšã©ãŒïŒV596ãªããžã§ã¯ãã¯äœæãããŸãããã䜿çšãããŠããŸããã'throw'ããŒã¯ãŒããæ¬ èœããŠããå¯èœæ§ããããŸãïŒthrow runtime_errorïŒFOOïŒ; bruteforce.h 161
tiny-dnnã©ã€ãã©ãª
tiny-dnnã©ã€ãã©ãªã® ç°¡åãªèª¬æïŒ
tiny-dnnã¯ã深局åŠç¿ã®C ++ 14å®è£ ã§ããéãããèšç®ãªãœãŒã¹ãçµã¿èŸŒã¿ã·ã¹ãã ãIoTããã€ã¹ã§ã®æ·±ãåŠç¿ã«é©ããŠããŸããæåã®ééã
class nn_error : public std::exception {
public:
explicit nn_error(const std::string &msg) : msg_(msg) {}
const char *what() const throw() override { return msg_.c_str(); }
private:
std::string msg_;
};
inline Device::Device(device_t type, const int platform_id, const int device_id)
: type_(type),
has_clcuda_api_(true),
platform_id_(platform_id),
device_id_(device_id) {
....
#else
nn_error("TinyDNN has not been compiled with OpenCL or CUDA support.");
#endif
}
PVS-StudioèŠåïŒV596ãªããžã§ã¯ãã¯äœæãããŸãããã䜿çšãããŠããŸããã'throw'ããŒã¯ãŒããæ¬ èœããŠããå¯èœæ§ããããŸãïŒthrow nn_errorïŒFOOïŒ; device.h 68
nn_errorã¯äŸå€ãã¹ããŒãã颿°ã§ã¯ãªããåãªãã¯ã©ã¹ã§ãããããã£ãŠã次ã®ããã«äœ¿çšããã®ãæ£ããã§ãã
throw nn_error("TinyDNN has not been compiled with OpenCL or CUDA support.");
ãã®ã¯ã©ã¹ã®ãã1ã€ã®èª€çšïŒV596ãªããžã§ã¯ãã¯äœæãããŸãããã䜿çšãããŠããŸããã'throw'ããŒã¯ãŒããæ¬ èœããŠããå¯èœæ§ããããŸãïŒthrow nn_errorïŒFOOïŒ; conv2d_op_opencl.h 1362
çªç®ã®ãšã©ãŒ
inline std::string format_str(const char *fmt, ...) {
static char buf[2048];
#ifdef _MSC_VER
#pragma warning(disable : 4996)
#endif
va_list args;
va_start(args, fmt);
vsnprintf(buf, sizeof(buf), fmt, args);
va_end(args);
#ifdef _MSC_VER
#pragma warning(default : 4996)
#endif
return std::string(buf);
}
PVS-StudioèŠåïŒV665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragmaèŠåïŒããã©ã«ãïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã代ããã«ããïŒpragmaèŠåïŒããã·ã¥/ãããïŒãã䜿çšããå¿ èŠããããŸãããã§ãã¯ã©ã€ã³ïŒ139ã146ãutil.h 146
Dlibã©ã€ãã©ãª
Dlib ã©ã€ãã©ãªã®ç°¡åãªèª¬æïŒ
Dlibã¯ãçŸå®äžçã®åé¡ã解決ããããã«C ++ã§è€éãªãœãããŠã§ã¢ãäœæããããã®æ©æ¢°åŠç¿ã¢ã«ãŽãªãºã ãšããŒã«ãå«ãææ°ã®C ++ããŒã«ãããã§ããæåã®ãšã©ãŒ
楜ãã¿ã®ããã«ããã®ãšã©ãŒãèªåã§èŠã€ããŠã¿ãŠãã ããã
class bdf_parser
{
public:
enum bdf_enums
{
NO_KEYWORD = 0,
STARTFONT = 1,
FONTBOUNDINGBOX = 2,
DWIDTH = 4,
DEFAULT_CHAR = 8,
CHARS = 16,
STARTCHAR = 32,
ENCODING = 64,
BBX = 128,
BITMAP = 256,
ENDCHAR = 512,
ENDFONT = 1024
};
....
bool parse_header( header_info& info )
{
....
while ( 1 )
{
res = find_keywords( find | stop );
if ( res & FONTBOUNDINGBOX )
{
in_ >> info.FBBx >> info.FBBy >> info.Xoff >> info.Yoff;
if ( in_.fail() )
return false; // parse_error
find &= ~FONTBOUNDINGBOX;
continue;
}
if ( res & DWIDTH )
{
in_ >> info.dwx0 >> info.dwy0;
if ( in_.fail() )
return false; // parse_error
find &= ~DWIDTH;
info.has_global_dw = true;
continue;
}
if ( res & DEFAULT_CHAR )
{
in_ >> info.default_char;
if ( in_.fail() )
return false; // parse_error
find &= ~DEFAULT_CHAR;
continue;
}
if ( res & NO_KEYWORD )
return false; // parse_error: unexpected EOF
break;
}
....
};
ãããèŠã€ããïŒ

圌女ã¯ããã«ããŸãïŒ
if ( res & NO_KEYWORD )
PVS-StudioèŠåïŒV616å€0ã®ãNO_KEYWORDããšããååã®å®æ°ããããåäœã®æäœã§äœ¿çšãããŸããfonts.cpp 288
ååä»ã宿°NO_KEYWORDã®å€ã¯0ã§ãããããã£ãŠãæ¡ä»¶ã¯ç¡æå³ã§ããæ¬¡ã®ããã«æžãã®ãæ£ããã§ãããïŒ
if ( res == NO_KEYWORD )
å¥ã®èª€ã£ããã§ãã¯ãããã«ãããŸããV616å€0ã®å®æ°ãšããååã®ãNO_KEYWORDãããããåäœã®æäœã§äœ¿çšãããŸããfonts.cpp 3342
çªç®ã®ãšã©ãŒ
void set(std::vector<tensor*> items)
{
....
epa.emplace_back(new enable_peer_access(*g[0], *g[i]));
....
}
PVS-StudioèŠåïŒV1023ææè ã®ãªããã€ã³ã¿ãŒããemplace_backãã¡ãœããã«ãã£ãŠãepaãã³ã³ãããŒã«è¿œå ãããŸããäŸå€ãçºçããå Žåãã¡ã¢ãªãªãŒã¯ãçºçããŸããtensor_tools.h 1665
ãã£ãããã©ãã«ããããçè§£ããããã«ãV1023蚺æã®ããã¥ã¡ã³ãã«ç²Ÿéããããšãææ¡ããŸãã
3çªç®ã®ééã
template <
typename detection_type,
typename label_type
>
bool is_track_association_problem (
const std::vector<
std::vector<labeled_detection<detection_type,label_type> > >& samples
)
{
if (samples.size() == 0)
return false;
unsigned long num_nonzero_elements = 0;
for (unsigned long i = 0; i < samples.size(); ++i)
{
if (samples.size() > 0)
++num_nonzero_elements;
}
if (num_nonzero_elements < 2)
return false;
....
}
PVS-Studioã®èŠåïŒV547åŒ 'samples.sizeïŒïŒ> 0'ã¯åžžã«trueã§ããsvm.h 360
ããã¯éåžžã«å¥åŠãªã³ãŒãã§ãïŒã«ãŒããéå§ããããšãæ¡ä»¶ïŒsamples.sizeïŒïŒ> 0ïŒã¯åžžã«çã«ãªããŸãããããã£ãŠãã«ãŒããç°¡ç¥åã§ããŸãã
for (unsigned long i = 0; i < samples.size(); ++i)
{
++num_nonzero_elements;
}
ãã®åŸãã«ãŒãã¯ãŸã£ããå¿ èŠãªãããšãæããã«ãªããŸããããã¯ã¯ããã«ç°¡åãã€å¹ççã«æžãããšãã§ããŸãïŒ
unsigned long num_nonzero_elements = samples.size();
ããããããã¯è¡ãããäºå®ã§ãããïŒã³ãŒãã¯æããã«ããã°ã©ããŒã«ããæ³šææ·±ãç ç©¶ã«å€ããŸãã
4çªç®ã®ééã
class console_progress_indicator
{
....
double seen_first_val;
....
};
bool console_progress_indicator::print_status (
double cur, bool always_print)
{
....
if (!seen_first_val)
{
start_time = cur_time;
last_time = cur_time;
first_val = cur;
seen_first_val = true; // <=
return false;
}
....
}
PVS-StudioèŠåïŒV601boolã¿ã€ãã¯æé»çã«doubleã¿ã€ãã«ãã£ã¹ããããŸããconsole_progress_indicator.h 136å€trueã¯
ãdoubleåã®ã¯ã©ã¹ã®ã¡ã³ããŒã«æžã蟌ãŸããŸããããŒã... 5çªç®ã®ééã
void file::init(const std::string& name)
{
....
WIN32_FIND_DATAA data;
HANDLE ffind = FindFirstFileA(state.full_name.c_str(), &data);
if (ffind == INVALID_HANDLE_VALUE ||
(data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) != 0)
{
throw file_not_found("Unable to find file " + name);
}
else
{
....
}
}
PVS-StudioèŠåïŒV773ãffindããã³ãã«ã«ãã£ãŠåç §ããããã¡ã€ã«ãéããã«äŸå€ãã¹ããŒãããŸããããªãœãŒã¹ãªãŒã¯ãçºçããå¯èœæ§ããããŸããdir_nav_kernel_1.cpp 60
ãã£ã¬ã¯ããªãèŠã€ãããšãäŸå€ãã¹ããŒãããŸãããããã誰ããã³ãã«ãéããŸããïŒ
6çªç®ã®ééã
ããäžã€ã®éåžžã«å¥åŠãªå Žæã
inline double poly_min_extrap(double f0, double d0,
double x1, double f_x1,
double x2, double f_x2)
{
....
matrix<double,2,2> m;
matrix<double,2,1> v;
const double aa2 = x2*x2;
const double aa1 = x1*x1;
m = aa2, -aa1,
-aa2*x2, aa1*x1;
v = f_x1 - f0 - d0*x1,
f_x2 - f0 - d0*x2;
....
}
PVS-StudioèŠåïŒV521 'ã'æŒç®åã䜿çšãããã®ãããªåŒã¯å±éºã§ããåŒãæ£ããããšã確èªããŠãã ãããOptimization_line_search.h211
ãããªãã¯ã¹ãåæåããããã«ã¹ã±ãžã¥ãŒã«ãããŠããŸãããã ããããããã¹ãŠã®aa2ãf_x1ãd0ãªã©ã¯ãdoubleåã®å€æ°ã«ãããŸãããããã¯ãã³ã³ãããããªãã¯ã¹ã®äœæãç®çãšããåŒæ°ãåºåãã®ã§ã¯ãªããå³åŽã®å€ãè¿ãéåžžã®ã³ã³ãæŒç®åã§ããããšãæå³ããŸãã
çµè«
èšäºã®åé ã§ãããã€ãã®äŸ¿å©ãªãã®ãäžåºŠã«çµã¿åãããæ¹æ³ã®äŸã瀺ããŸãããéçã¢ãã©ã€ã¶ãŒã®äœ¿çšã¯ãããã€ãã®çç±ã§åæã«åœ¹ç«ã¡ãŸãã
- ãã¬ãŒãã³ã°ãã¢ãã©ã€ã¶ãŒã®èŠåã調ã¹ãããšã§ãå€ãã®æ°ãããŠäŸ¿å©ãªããšãåŠã¶ããšãã§ããŸããäŸïŒmemsetãïŒpragma warningãemplace_backãå³å¯ã«æŽåã
- ã¿ã€ããã¹ããã°ãæœåšçãªè匱æ§ã®æ©æçºèŠã
- ã³ãŒãã¯åŸã ã«è¯ããªããåçŽã«ãªããçè§£ãããããªã£ãŠããŸãã
- ãããžã§ã¯ããéçºãããšãã¯ãèªããæã£ãŠãææ°ã®ãã¯ãããžãŒã䜿çšããŠããããšãå šå¡ã«äŒããããšãã§ããŸã:)ããããŠãããã¯éšåçã«ãŠãŒã¢ã¢ã§ããããã¯çã®ç«¶äºäžã®å©ç¹ã§ãã
å¯äžã®åé¡ã¯ãã©ã®ããã«éå§ãããããããç°¡åã«å®è£ ããæ¹æ³ããããŠãããæ£ãã䜿çšããæ¹æ³ã§ããæ¬¡ã®èšäºã¯ããã«åœ¹ç«ã¡ãŸãïŒ
- Cããã³C ++ã³ãŒãçšã®PVS-Studioã¢ãã©ã€ã¶ãŒã«ãã£ãŠçæãããè峿·±ãèŠåããã°ãã衚瀺ããã«ã¯ã©ãããã°ããã§ããïŒ
- éçã³ãŒãã¢ãã©ã€ã¶ãŒãã¬ã¬ã·ãŒãããžã§ã¯ãã«å®è£ ããããŒã ã®ææ¬²ãåãæ¹æ³ã
- éçåæãããã»ã¹ã«å°å ¥ããŸãããã°ãæ¢ãã®ã§ã¯ãããŸããã

ãã®èšäºãè±èªã話ãèŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãªã³ã¯ã䜿çšããŠãã ããïŒAndreyKarpovãããããŒã®ã¿ã®C ++ã©ã€ãã©ãªã³ã¬ã¯ã·ã§ã³ã®ãã§ãã¯ïŒawesome-hppïŒã