
æè¿ãPVS-Studioã¢ãã©ã€ã¶ãŒã®LinuxããŒãžã§ã³ããªãªãŒã¹ãããŸããã ãã®å©ããåããŠãå€ãã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãããã¹ããããŸããã ãããã®äžã«ã¯ãChromiumãGCCãLLVMïŒClangïŒãªã©ããããŸãã ãããŠä»æ¥ãä»®æ³çŸå®ã³ãã¥ããã£ã®ããã«ãŠã©ã«ããã£ãºããŒã¢ãã¡ãŒã·ã§ã³ã¹ã¿ãžãªãéçºãããããžã§ã¯ãããã®ãªã¹ãã«å ãããŸãã æ€åºãããã¢ãã©ã€ã¶ãŒã®èŠåã®ç¢ºèªãå§ããŸãããã
ãã£ãºããŒã«ã€ããŠå°ã
ãŠã©ã«ããã£ãºããŒã¯é·å¹Žã«ããããäžçäžã®ãã¬ãèŠèŽè ãé æçãªã¹ããŒãªãŒããã£ã©ã¯ã¿ãŒã§åã°ããå¿ããããªãäœéšãæäŸããŠããŸããã 幎ã ããã£ãºããŒã¯ãŸããŸãåºæ¿çã§é¢çœããå®è£ ãé£ããæ ç»ã挫ç»ãçã¿åºããŠããŸãã ãããã£ãŠãèŠèŠå¹æã«é¢ããã¢ãŒãã£ã¹ãã®åµé çãªã¢ã€ãã¢ã®å®çŸã«è²¢ç®ããããŸããŸãªããã°ã©ã ã®éçºã«å¯ŸããããŒãºãé«ãŸã£ãŠããŸãã
Walt Disney Animation Studiosã®ããã°ã©ããŒã¯ãããŒãã£ã«ãªã¢ãªãã£æ¥çã®ãã¹ãŠã®ãŠãŒã¶ãŒåãã«ãªãŒãã³ãœãŒã¹Cããã³C ++ããã°ã©ã ãšããŠå©çšå¯èœãªæè¡ãäœæããããšã«ãããã¢ãã¡ãŒã·ã§ã³ããã³èŠèŠå¹æã®å°é家ããµããŒãããŠããŸãã ãããã®ããã°ã©ã ã¯æ¬¡ã®ãšããã§ãã
- PartioïŒçµ±äžãããç»åã©ã€ãã©ãªãšåãåçã§å®è£ ãããåäžã®ã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠæšæºã®ç²åãã¡ã€ã«åœ¢åŒã§äœæ¥ããããšãã§ããŸãïŒ
- AlembicïŒããžã¿ã«ã³ã³ãã³ãäœæããã±ãŒãžéã§ã¢ãã¡ãŒã·ã§ã³ã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ã亀æããããã®æ¥çæšæºã«ãªãã€ã€ãããªãŒãã³äº€æ圢åŒïŒ
- ãŠãããŒãµã«ã·ãŒã³èšè¿°ïŒããŸããŸãªã°ã©ãã£ãã¯ã¢ããªã±ãŒã·ã§ã³éã§äº€æããããã®ã·ãŒã³ããŒã¿ã®èªã¿åããšéä¿¡ãå¯èœãªå¹ççãªã·ã¹ãã ïŒ
- OpenSubdivïŒçž®å°ã¢ãã«ã«åºã¥ããŠãµãŒãã§ã¹ïŒãµããã£ããžã§ã³ãµãŒãã§ã¹ïŒã®è©³çŽ°ãªã¬ã³ããªã³ã°ãæäŸïŒ
- DinamicaïŒAutodesk Mayaã®ãã©ã°ã€ã³ããªã¢ã«ã¿ã€ã ç©çãšã³ãžã³Bullet Physics Libraryã«åºã¥ããŠéçºïŒ
- PTexïŒãã¯ã¹ãã£ãããã³ã°ã·ã¹ãã ïŒ
ãã£ãºããŒã®ãªãŒãã³ãœãŒã¹ãœãããŠã§ã¢ã¯https://disney.github.io/ããããŠã³ããŒãã§ããŸã ã
æ€èšŒçµæ
Walt Disneyãæ€èšããŠãããããžã§ã¯ãã¯å°èŠæš¡ã§ãCããã³C ++ã§æ°äžè¡ã®ã³ãŒããããªãã ãããã£ãŠããã®ãããªå°æ°ã®ãããžã§ã¯ããšã©ãŒã
ãã«ãã£ãªãããžã§ã¯ã

PVS-StudioèŠåïŒ V547åŒ '"R"'ã¯åžžã«çã§ãã PDA.cpp 90
ParticlesDataMutable* readPDA(....) { .... while(input->good()) { *input>>word; .... if(word=="V"){ attrs.push_back(simple->addAttribute(....); }else if("R"){ // <= attrs.push_back(simple->addAttribute(....); }else if("I"){ // <= attrs.push_back(simple->addAttribute(....); } index++; } .... }
ã¢ãã©ã€ã¶ãŒã¯ãæ¡ä»¶ãåžžã«çã§ãããšããã¡ãã»ãŒãžãçºè¡ããŸããã ããã¯ã elseãã©ã³ãã§å®çŸ©ãããŠããã¢ã¯ã·ã§ã³ãå®è¡ãããªããšããäºå®ã«ã€ãªãããŸãã ããã°ã©ããŒã®äžæ³šæã®ããã«ãã®ç¶æ³ãçºçãããšæããŸãããã®ãããªãšã©ãŒã«ã€ãªãããªãæ¡ä»¶ã¯æ¬¡ã®ããã«ãªããŸãã
.... if(word=="V"){ attrs.push_back(simple->addAttribute(....); }else if(word=="R"){ // <= attrs.push_back(simple->addAttribute(....); }else if(word=="I"){ // <= attrs.push_back(simple->addAttribute(....); } ....
PVS-Studio èŠå ïŒ V528 ãcharãåãžã®ãã€ã³ã¿ãŒãã\ 0ãå€ãšæ¯èŒãããã®ã¯å¥åŠã§ãã ãããã以äžãæå³ããŸãïŒ* charArray [i]ïŒ= '\ 0'ã MC.cpp 109
int CharArrayLen(char** charArray) { int i = 0; if(charArray != false) { while(charArray[i] != '\0') // <= { i++; } } return i; }
æ£ããç解ã§ããã°ã CharArrayLené¢æ°ã¯charArrayæååã®æåæ°ãã«ãŠã³ãããŸãã ããããããã¯æ¬åœã«ããã§ããïŒ ç§ã®æèŠã§ã¯ã charåãžã®ãã€ã³ã¿ãŒãå€'\ 0'ãšæ¯èŒãããããã whileã«ãŒãã®ç¶æ ã«ãšã©ãŒããããŸãã ãã€ã³ã¿ãŒã®éåç §æäœãå¿ããããå¯èœæ§ãé«ãã§ãã ãããã£ãŠã whileã«ãŒãã®æ¡ä»¶ã¯æ¬¡ã®ããã«ãªããŸãã
while ((*charArray)[i] != '\0')
ã¡ãªã¿ã«ãå°ãé«ãäœçœ®ã«ãããã§ãã¯ãéåžžã«å¥åŠã§ãã
if(charArray != false)
æ€èšŒã¯ãã¡ããæ©èœããŸãããããã次ã®ããã«çœ®ãæããæ¹ãã¯ããã«åªããŠããŸãã
if(charArray != nullptr)
äžè¬çã«ãç ä¿®çãæ©èœãéçºããŠããããå®äºããŠããªãããã§ãã strlenïŒïŒé¢æ°ã䜿çšããŠã³ãŒããèšè¿°ããªãçç±ã¯æããã§ã¯ãããŸããã
int CharArrayLen(const char** charArray) { if (charArray == nullptr) return 0; return strlen(*charArray); }
PVS-Studio èŠå ïŒ V701 reallocïŒïŒãªãŒã¯ã®å¯èœæ§ïŒreallocïŒïŒãã¡ã¢ãªã®å²ãåœãŠã«å€±æãããšãå ã®ãã€ã³ã¿ãŒ 'attributeData [i]'ã倱ãããŸãã reallocïŒïŒãäžæãã€ã³ã¿ãŒã«å²ãåœãŠãããšãæ€èšããŠãã ããã ParticleSimple.cpp 266
ParticleIndex ParticlesSimple:: addParticle() { .... for(unsigned int i=0;i<attributes.size();i++) attributeData[i]= (char*)realloc(attributeData[i], // <= (size_t)attributeStrides[i]* (size_t)allocatedCount); .... }
ã¢ãã©ã€ã¶ãŒã¯ãã³ãŒãã§reallocã®å±éºãªäœ¿çšãæ€åºããŸããã foo = reallocïŒfooã...ïŒã®æ§é ã¯å±éºã§ããã¡ã¢ãªãå²ãåœãŠãããšãã§ããªãå Žåãé¢æ°ã¯nullptrãè¿ãããããã€ã³ã¿ã®ä»¥åã®å€ãäžæžããããã¡ã¢ãªãªãŒã¯ãããã°ã©ã ã®ã¯ã©ãã·ã¥ã«ã€ãªããå¯èœæ§ããããŸãã ããããããã®ç¶æ³ã¯å€ãã®å Žåéåžžã«ãŸãã§ãããå®å šã«ãã¬ã€ãã䟡å€ã¯ãŸã ãããšæããŸãã ãã®ç¶æ³ãé²ãããã«ã reallocã䜿çšããåã«ãè¿œå ã®å€æ°ã«ãã€ã³ã¿ãŒå€ãä¿åããããšããå§ãããŸãã
åæ§ã®ã¢ãã©ã€ã¶ãŒèŠåïŒ
- V701 reallocïŒïŒãªãŒã¯ã®å¯èœæ§ïŒreallocïŒïŒãã¡ã¢ãªã®å²ãåœãŠã«å€±æãããšãå ã®ãã€ã³ã¿ 'attributeData [i]'ã倱ãããŸãã reallocïŒïŒãäžæãã€ã³ã¿ãŒã«å²ãåœãŠãããšãæ€èšããŠãã ããã ParticleSimple.cpp 280
- V701 reallocïŒïŒãªãŒã¯ã®å¯èœæ§ïŒreallocïŒïŒãã¡ã¢ãªã®å²ãåœãŠã«å€±æãããšãå ã®ãã€ã³ã¿ 'data'ã倱ãããŸãã reallocïŒïŒãäžæãã€ã³ã¿ãŒã«å²ãåœãŠãããšãæ€èšããŠãã ããã ParticleSimpleInterleave.cpp 281
- V701 reallocïŒïŒãªãŒã¯ã®å¯èœæ§ïŒreallocïŒïŒãã¡ã¢ãªã®å²ãåœãŠã«å€±æãããšãå ã®ãã€ã³ã¿ 'data'ã倱ãããŸãã reallocïŒïŒãäžæãã€ã³ã¿ãŒã«å²ãåœãŠãããšãæ€èšããŠãã ããã ParticleSimpleInterleave.cpp 292
ã¢ã¬ã³ããã¯ãããžã§ã¯ã

PVS-StudioèŠåïŒ V501 ã||ãã®å·Šãšå³ã«åããµãåŒãm_uKnotãããããŸã æŒç®åã ONuPatch.h 253
class Sample { public: .... bool hasKnotSampleData() const { if( (m_numU != ABC_GEOM_NUPATCH_NULL_INT_VALUE) || (m_numV != ABC_GEOM_NUPATCH_NULL_INT_VALUE) || (m_uOrder != ABC_GEOM_NUPATCH_NULL_INT_VALUE) || (m_vOrder != ABC_GEOM_NUPATCH_NULL_INT_VALUE) || m_uKnot || m_uKnot) // <= return true; else return false; } .... protected: .... int32_t m_numU; int32_t m_numV; int32_t m_uOrder; int32_t m_vOrder; Abc::FloatArraySample m_uKnot; Abc::FloatArraySample m_vKnot; .... }
ç¹°ãè¿ããŸãããããã°ã©ããŒã®äžåšã«é¢ãããšã©ãŒã§ãã ç¹°ãè¿ããã£ãŒã«ãm_uKnotã®ä»£ããã«ãæ¡ä»¶ãm_vKnotã§ãããšæšæž¬ããã®ã¯ç°¡åã§ãã
PVS-StudioèŠåïŒ V523 ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ãã OFaceSet.cpp 230
void OFaceSetSchema::set( const Sample &iSamp ) { .... if ( iSamp.getSelfBounds().hasVolume() ) { // Caller explicity set bounds for this sample of the faceset. m_selfBoundsProperty.set( iSamp.getSelfBounds() ); // <= } else { m_selfBoundsProperty.set( iSamp.getSelfBounds() ); // <= // NYI compute self bounds via parent mesh's faces } .... }
PVS-Studioã¯ãã³ãŒãå ã§if..elseã¹ããŒãã¡ã³ããæ€åºããŸãããããã¯ãç°ãªãã³ã¡ã³ãã«ãããããããäž¡æ¹ã®çµæã§åãããšãå®è¡ããŸãã ã³ãŒãã®ãã®ã»ã¯ã·ã§ã³ã¯ãããã°ã©ããŒããŒã ã®æ¬¡ã®ã¿ã¹ã¯ã®ãã¥ãŒã«æ¶ããŠããå¯èœæ§ããããŸãããçŸæç¹ã§ã¯ããã®ã³ãŒãã®ã»ã¯ã·ã§ã³ã¯èª€ãã§ãããæ¹åããå¿ èŠããããŸãã
PVS-StudioèŠåïŒ V629 ã1 << iStreamIDãåŒã®æ€æ»ãæ€èšããŠãã ããã 32ãããå€ã®ãããã·ãããšãããã«ç¶ã64ãããã¿ã€ããžã®æ¡åŒµã StreamManager.cpp 176
void StreamManager::put( std::size_t iStreamID ) { .... // CAS (compare and swap) non locking version Alembic::Util::int64_t oldVal = 0; Alembic::Util::int64_t newVal = 0; do { oldVal = m_streams; newVal = oldVal | ( 1 << iStreamID ); // <= } while ( ! COMPARE_EXCHANGE( m_streams, oldVal, newVal ) ); }
ã¢ãã©ã€ã¶ãŒã¯ãã·ããæäœãå«ãåŒã«æœåšçãªãšã©ãŒãæ€åºããŸããã
åŒnewVal = oldVal | ïŒ1 << iStreamIDïŒ intãšããŠè¡šãããåäœãã·ããããããã®åŸãã·ããçµæã64ãããåã«å€æãããŸãã ããã§ã®æœåšçãªãšã©ãŒã¯ã iStreamIDå€æ°ã®å€ã32ãè¶ ããå Žåãæªå®çŸ©ã®åäœã®ããã«ã³ãŒãã®ãã®ã»ã¯ã·ã§ã³ãæ£ããæ©èœããªãããšã§ãã
æ°å€1ã64ãããã®ç¬Šå·ãªãããŒã¿åã§è¡šãããå Žåãã³ãŒãã¯ããå®å šã«ãªããŸãã
newVal = oldVal | ( Alembic::Util::int64_t(1) << iStreamID );
ã¢ãã©ã€ã¶ãŒã¯å¥ã®èŠåãçºè¡ããŸããïŒ
- V629ã1 <<ïŒval-1ïŒãåŒã®æ€æ»ãæ€èšããŠãã ããã 32ãããå€ã®ãããã·ãããšãããã«ç¶ã64ãããã¿ã€ããžã®æ¡åŒµã StreamManager.cpp 148
ãŠãããŒãµã«ã·ãŒã³èšè¿°ãããžã§ã¯ã

PVS-StudioèŠåïŒ V668ã¡ã¢ãªããæ°ãããæŒç®åã䜿çšããŠå²ãåœãŠããããããã_ rawBufferããã€ã³ã¿ãnullã«å¯ŸããŠãã¹ãããæå³ããããŸããã ã¡ã¢ãªå²ãåœãŠãšã©ãŒã®å ŽåãäŸå€ãçæãããŸãã uvTextureStorageData.cpp 118
bool GlfUVTextureStorageData::Read(....) { .... _rawBuffer = new unsigned char[_size]; // <= if (_rawBuffer == nullptr) { // <= TF_RUNTIME_ERROR("Unable to allocate buffer."); return false; } .... return true; }
çŸä»£ã®èšèªæšæºã«ããã°ãã¡ã¢ãªå²ãåœãŠã倱æããå Žåã®newã¯nullptrãè¿ãã®ã§ã¯ãªããäŸå€ãã¹ããŒããŸãã ãã®ã³ãŒãã¯ãããã°ã©ãã³ã°ã®å€é¢šãªãã®ã§ãã ææ°ã®ã³ã³ãã€ã©ã§ã¯ããããã®ãã§ãã¯ã¯æå³ããªããªããããåé€ã§ããŸãã
PVS-StudioèŠåïŒ V501 '|'ã®å·Šãšå³ã«åããµãåŒ 'HdChangeTracker :: DirtyPrimVar'ããããŸã æŒç®åã baseCurves.cpp 563
HdBasisCurves::_GetInitialDirtyBits() const { int mask = HdChangeTracker::Clean; mask |= HdChangeTracker::DirtyPrimVar // <= | HdChangeTracker::DirtyWidths | HdChangeTracker::DirtyRefineLevel | HdChangeTracker::DirtyPoints | HdChangeTracker::DirtyNormals | HdChangeTracker::DirtyPrimVar // <= | HdChangeTracker::DirtyTopology .... ; return (HdChangeTracker::DirtyBits)mask; }
maskã決å®ããããã«ãå€ãã®ãã£ãŒã«ãã䜿çšãããŸãããããã®äžã«ã¯ç¹°ãè¿ããã£ãŒã«ãããããŸãã ãã®ãããããã°ã©ãã¯åããã£ãŒã«ããäžæ³šæã«å床䜿çšãããã DirtyPrimVarãã£ãŒã«ããç¹°ãè¿ã代ããã«å¥ã®ãã£ãŒã«ãã䜿çšããå¿ èŠããããŸãã
åæ§ã®èŠåïŒ
- V501ã|ãã®å·Šãšå³ã«åäžã®ãµãåŒãHdChangeTracker :: DirtyPrimVarãããããŸã æŒç®åã mesh.cpp 1199
OpenSubdivãããžã§ã¯ã

PVS-StudioèŠåïŒ V595 nullptrã«å¯ŸããŠæ€èšŒãããåã«ããå®å ããã€ã³ã¿ãŒã䜿çšãããŸããã ãã§ãã¯è¡ïŒ481ã483ãhbr_utils.h 481
template <class T> void createTopology(....) { .... OpenSubdiv::HbrVertex<T> * destination = mesh->GetVertex( fv[(j+1)%nv] ); OpenSubdiv::HbrHalfedge<T> * opposite = destination->GetEdge(origin); // <= if(origin==NULL || destination==NULL) // <= { printf(....); valid=false; break; } .... }
ãããããV595ã¯ã¢ãã©ã€ã¶ãŒã«ãã£ãŠçºè¡ãããæãäžè¬çãªèŠåã§ãã PVS-Studioã¯ããã€ã³ã¿ãŒãéåç §ãããã³ãŒãã®äžã§ãã§ãã¯ãããå Žåãã³ãŒããå±éºãšèŠãªããŸãã ãã€ã³ã¿ãŒããã§ãã¯ãããŠããå ŽåããŒãã§ãããšæ³å®ãããŸãã
ãããäžèšã®ã³ãŒãã»ã¯ã·ã§ã³ã§çºçããŸãã å察ã®ãã€ã³ã¿ãŒãåæåããããã«ã å®å ãã€ã³ã¿ãŒãéåç §ããã次ã«ãããã®ãã€ã³ã¿ãŒãNULLã«ã€ããŠãã§ãã¯ãããŸã ã
ããã«ããã€ãã®èŠåïŒ
- V595 nulldestrã«å¯ŸããŠæ€èšŒãããåã«ããå®å ããã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªããŠãã ããïŒ145ã148ãhbr_tutorial_1.cpp 145
- V595 nulldestrã«å¯ŸããŠæ€èšŒãããåã«ããå®å ããã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªããŠãã ããïŒ215ã218ãhbr_tutorial_2.cpp 215
PVS-Studio èŠå ïŒ V547åŒ 'buffer [0] ==' \ r '&& buffer [0] ==' \ n ''ã¯åžžã«falseã§ãã ãããã '||' ããã§æŒç®åã䜿çšããå¿ èŠããããŸãã hdr_reader.cpp 84
unsigned char *loadHdr(....) { .... char buffer[MAXLINE]; // read header while(true) { if (! fgets(buffer, MAXLINE, fp)) goto error; if (buffer[0] == '\n') break; if (buffer[0] == '\r' && buffer[0] == '\n') break; // <= .... } .... }
ããã°ã©ããŒãæ¡ä»¶ã®èšè¿°ãééãããããæ¡ä»¶ãåžžã«falseã§ãããšããäºå®ã«è³ããŸããã ããããããã°ã©ããŒã¯ã \ nã\ r \ nãªã©ã®è¡ããŒã«ãŒãååšããå Žåã¯ã whileã«ãŒããçµäºããå¿ èŠããããŸã ã ãããã£ãŠããšã©ãŒç¶æ ã¯æ¬¡ã®ããã«èšè¿°ããå¿ èŠããããŸãã
if (buffer[0] == '\r' && buffer[1] == '\n') break;
PVS-StudioèŠåïŒ V593 ãA = BïŒ= Cããšããè¡šçŸãæ€èšããããšãæ€èšããŠãã ããã åŒã¯æ¬¡ã®ããã«èšç®ãããŸãïŒ 'A =ïŒBïŒ= CïŒ'ã main.cpp 652
main(int argc, char ** argv) { .... #if defined(OSD_USES_GLEW) if (GLenum r = glewInit() != GLEW_OK) { // <= printf("Failed to initialize glew. error = %d\n", r); exit(1); } #endif .... }
ã¢ãã©ã€ã¶ãŒã¯ãåŒGLenum r = glewInitïŒïŒïŒ= GLEW_OKã§æœåšçãªãšã©ãŒãæ€åºããŸããããããã¯ããããããã°ã©ããŒãæå³ãããšããã«æ©èœããŸããã ãã®ãããªã³ãŒããäœæããããšã«ãããããã°ã©ããŒã¯ãååãšããŠã次ã®é åºã§ã¢ã¯ã·ã§ã³ãå®è¡ããããšãæã¿ãŸãã
(GLenum r = glewInit()) != GLEW_OK
ãã ãããïŒ=ãæŒç®åã®åªå é äœã¯ãå²ãåœãŠæŒç®åã®åªå é äœãããé«ããªã£ãŠããŸãã ãããã£ãŠãåŒã¯æ¬¡ã®ããã«è©äŸ¡ãããŸãã
GLenum r = (glewInit() != GLEW_OK)
ãããã£ãŠã glewInitïŒïŒé¢æ°ãæ£ããæ©èœããªãå Žåãç»é¢ã«èª€ã£ããšã©ãŒã³ãŒããåºåãããŸãã ããæ£ç¢ºã«ã¯ããŠãããã¯åžžã«å°å·ãããŸãã
ãšã©ãŒãä¿®æ£ããã«ã¯ããã©ã±ããã䜿çšããããæ¡ä»¶ã®å¶éãè¶ ããŠãªããžã§ã¯ãã®äœæãåé€ããŸããããã«ãããã³ãŒããããèªã¿ããããªããŸãã ã ããã°ã©ãã³ã°ããªãã¡ã¯ã¿ãªã³ã°ããã®ä»ãã¹ãŠã®åé¡ ããšããæ¬ã®ç¬¬16ç« ãåç §ããŠãã ããã
PVS-Studioã¯ãããã«ããã€ãã®åæ§ã®å ŽæãçºèŠããŸããã
- V593ãA = BïŒ= Cãã®è¡šçŸãæ€èšããããšãæ€èšããŠãã ããã åŒã¯æ¬¡ã®ããã«èšç®ãããŸãïŒ 'A =ïŒBïŒ= CïŒ'ã glEvalLimit.cpp 1419
- V593ãA = BïŒ= Cãã®è¡šçŸãæ€èšããããšãæ€èšããŠãã ããã åŒã¯æ¬¡ã®ããã«èšç®ãããŸãïŒ 'A =ïŒBïŒ= CïŒ'ã glStencilViewer.cpp 1128
- V593ãA = BïŒ= Cãã®è¡šçŸãæ€èšããããšãæ€èšããŠãã ããã åŒã¯æ¬¡ã®ããã«èšç®ãããŸãïŒ 'A =ïŒBïŒ= CïŒ'ã farViewer.cpp 1406
PVS-Studio èŠå ïŒ V701 reallocïŒïŒãªãŒã¯ã®å¯èœæ§ïŒreallocïŒïŒãã¡ã¢ãªã®å²ãåœãŠã«å€±æãããšãå ã®ãã€ã³ã¿ãŒãm_blocksãã倱ãããŸãã reallocïŒïŒãäžæãã€ã³ã¿ãŒã«å²ãåœãŠãããšãæ€èšããŠãã ããã allocator.h 145
template <typename T> T* HbrAllocator<T>::Allocate() { if (!m_freecount) { .... // Keep track of the newly allocated block if (m_nblocks + 1 >= m_blockCapacity) { m_blockCapacity = m_blockCapacity * 2; if (m_blockCapacity < 1) m_blockCapacity = 1; m_blocks = (T**) realloc(m_blocks, // <= m_blockCapacity * sizeof(T*)); } m_blocks[m_nblocks] = block; // <= .... } .... }
ç¹°ãè¿ããŸããã reallocé¢æ°ã®å±éºãªäœ¿çšã ãããŠããªããããå±éºãªã®ãã«ã€ããŠã¯ããPartioãããžã§ã¯ããã®ã»ã¯ã·ã§ã³ã§èª¬æããŠããŸãã
Dynamicaãããžã§ã¯ã

PVS-StudioèŠåïŒ V512 ãmemsetãé¢æ°ãåŒã³åºããšããããã¡ãŒãheader.paddingãããªãŒããŒãããŒããŸãã pdbIO.cpp 249
struct pdb_header_t { int magic; unsigned short swap; float version; float time; unsigned int data_size; unsigned int num_data; char padding[32]; //pdb_channel_t **data; int data; }; bool pdb_io_t::write(std::ostream &out) { pdb_header_t header; .... header.magic = PDB_MAGIC; header.swap = 0; header.version = 1.0; header.time = m_time; header.data_size = m_num_particles; header.num_data = m_attributes.size(); memset(header.padding, 0, 32 * sizeof(char) + sizeof(int)); .... }
ã¢ãã©ã€ã¶ã¯ã header.paddingã¡ã¢ãªãããã¡ã®å å¡«ã«é¢é£ããæœåšçãªãšã©ãŒãæ€åºããŸããã ããã°ã©ãã¯ãmemsetã䜿çšããŠã header.paddingãããã¡å ã®36ãã€ãããªã»ããããŸããããã¯32ãã€ãã®ã¿ã§æ§æãããŠããŸãã äžèŠããã®äœ¿çšã¯ééã£ãŠããŸãããå®éãããã°ã©ããŒã¯æ±ãã«ããããšãå€æãã header.paddingãšãšãã«ããŒã¿å€æ°ããªã»ããããŸãã çµå±ã pdb_header_tæ§é äœã®ããã£ã³ã°ãšããŒã¿ ãã£ãŒã«ãã¯é çªã«é 眮ãããŸããã€ãŸããããããã¡ã¢ãªå ã«é çªã«é 眮ãããŸãã ã¯ãïŒ ãã®ç¶æ³ã«ééãã¯ãããŸãããããã®å Žæã§ã®ãã®ãããªããªãã¯ã«ããããšã©ãŒãçºçããå¯èœæ§ããããŸãã ããšãã°ãå¥ã®ããã°ã©ããpdb_header_tã®æ§é ãå€æŽãã ããã£ã³ã°ãã£ãŒã«ããšããŒã¿ãã£ãŒã«ãã®éã«èªåã®ãã£ãŒã«ããè¿œå ããŠããååã®ããªãã¯ã«æ°ä»ããªãå Žåã ãããã£ãŠãåå€æ°ãåå¥ã«ãªã»ããããããšããå§ãããŸãã
Ptexãããžã§ã¯ã

PVS-StudioèŠåïŒ V612ã«ãŒãå ã®ç¡æ¡ä»¶ã®ãæ»ããã PtexHashMap.h 292
Entry* lockEntriesAndGrowIfNeeded(size_t& newMemUsed) { while (_size*2 >= _numEntries) { Entry* entries = lockEntries(); if (_size*2 >= _numEntries) { entries = grow(entries, newMemUsed); } return entries; } return lockEntries(); }
äžèšã®é¢æ°ã«ã¯ãæåã®ãã¹ã§ãšã³ããªãžã®ãã€ã³ã¿ãè¿ãããçãããwhileã«ãŒãããããŸã ã ããã§äœããæ··ä¹±ããŠãããšæããŸãããïŒ ã³ãŒãã®ãã®ã»ã¯ã·ã§ã³ã§ã¯ããã詳现ãªæ€èšãå¿ èŠã§ãã
ãããã«
é«å質ã®ãœãããŠã§ã¢ãäœæããéã®éçã³ãŒãåæã¯éåžžã«éèŠãªåœ¹å²ãæãããŸããéçåæãå®æçã«äœ¿çšããããšã§ãæããªãšã©ãŒãæ€åºãé£ãããšã©ãŒãæé€ããããã®åŽåãæžããæçšãªãã®ã«ããå€ãã®æéãè²»ããããšãã§ããããã§ãã
ãããžã§ã¯ãã®ãšã©ãŒããŸã 確èªããŠãããããã°ã®ãšããµã€ãã£ã³ã°ãªæ€çŽ¢ã«çæããŠããªãå Žåã¯ã PVS-Studio for LinuxãããŠã³ããŒãããŠãå¿ ãå®è¡ããããšããå§ãããŸãã
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒMaxim Stefanovã PVS-Studio for Linuxã¯ããã£ãºããŒåšèŸºãã¢ãŒã«åå ããŸãã ã
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã