éçã³ãŒãåæããŒã«ã䜿çšãããšãããã°ã©ã ããã¹ããèšè¿°ãã段éã§ãå€ãã®ãšã©ãŒãæé€ã§ããŸãã ããšãã°ãã¿ã€ããã¹ããã°ããç¹å®ããŠæé€ã§ããŸãã äžéšã®ããã°ã©ããŒã¯ãã¿ã€ããã¹ãæããªééããç¯ããªãããšãå¿ãã確信ããŠããŸãã ããã§ã¯ãããŸããã 誰ãããã®ãããªéã¡ãç¯ããŸãã ãã®èšäºã¯è¯ããã¢ãšããŠåœ¹ç«ã¡ãŸãã ã¿ã€ããã¹ã¯ãQtã®ãããªé«å質ã§ãã¹ãæžã¿ã®ãããžã§ã¯ãã§ãèŠã€ãããŸãã
Qt
Qtã¯ãC ++ããã°ã©ãã³ã°èšèªã®ã¯ãã¹ãã©ãããã©ãŒã ãœãããŠã§ã¢éçºããŒã«ãããã§ãã ãœãŒã¹ã³ãŒããå€æŽããã«åOSã®ããã°ã©ã ãã³ã³ãã€ã«ããã ãã§ãã»ãšãã©ã®ææ°ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ããã®å©ããåããŠæžããããœãããŠã§ã¢ãå®è¡ã§ããŸãã GUIèŠçŽ ãããããã¯ãŒã¯ãããŒã¿ããŒã¹ãããã³XMLãæäœããããã®ã¯ã©ã¹ã«è³ããŸã§ãã¢ããªã±ãŒã·ã§ã³ãœãããŠã§ã¢ã®éçºã«å¿ èŠãšãªãå¯èœæ§ã®ãããã¹ãŠã®åºæ¬ã¯ã©ã¹ãå«ãŸããŠããŸãã Qtã¯å®å šã«ãªããžã§ã¯ãæåã§ãããç°¡åã«æ¡åŒµã§ããã³ã³ããŒãã³ãããã°ã©ãã³ã°æè¡ããµããŒãããŠããŸãã [ãœãŒã¹ïŒãŠã£ãããã£ã¢]
åç §ïŒ
- ãŠã£ãããã£ã¢-Qt ;
- Qt Project Webãµã€ãã
- 2011幎ã®Qt 4.7.3ã®æ€èšŒã«é¢ããèšäº ã
Klocworkããã³Coverityã¢ãã©ã€ã¶ãŒã䜿çšããŠQtãããžã§ã¯ãããã§ãã¯ããããšããäºå®ã«ãããããããPVS-Studioããšã©ãŒãèŠã€ããããšãã§ãããšããäºå®ã«æ³šæãåèµ·ããããšæããŸãã ãããã®ã¢ãã©ã€ã¶ãŒã®äœ¿çšé »åºŠã¯ããããŸããã ãã ããKlocworkãšCoverityã¯ãã°ãã©ãã«ãŒãšChangeLog-xxxãã¡ã€ã«ã§èšåãããŠããŸãã ãŸããã€ã³ã¿ãŒãããäžã§ãPC-lintã䜿çšããŠQtãå®æçã«ãã§ãã¯ããããšããèšåãèŠã€ããŸããã
Qtãããžã§ã¯ãæ€èšŒã®æ©èœ
å€æŽã®ããã«ãPVS-Studio Standaloneã§å°å ¥ãããæ°ããã¡ã«ããºã ã§Qtããã¹ãããŸããã ã¡ã«ããºã ã«ã€ããŠã¯ãããŸã§èª°ãç¥ãããæã ãã®ååšã«ã€ããŠèšäºã§æãåºãããŸãã ãã®æ°ããç¥ç§çã§çŸããã¡ã«ããºã ã¯äœã§ããïŒ
nmakeãªã©ã䜿çšããŠãã«ããããŠããå ŽåãPVS-Studioã䜿çšããŠãããžã§ã¯ããæ€èšŒããã®ã¯é£ããå ŽåããããŸãã PVS-Studioãã¢ã»ã³ããªã«çµ±åããå¿ èŠããããŸãããããã¯ããã»ã©åçŽã§ã¯ãããŸããã å°ãªããšããããã«ãããããŒã«ããã°ããè©ŠããŠè©äŸ¡ããããšãæããã«å°é£ã«ãªããŸãã
PVS-Studioã«æ°ããæäœã¢ãŒããç»å ŽããŸãããããã«ããããã®ãããªãããžã§ã¯ãã§ã®äœæ¥ãå€§å¹ ã«å®¹æã«ãªããŸãã ã¢ãã©ã€ã¶ãŒã¯ãã³ã³ãã€ã©ãŒãã©ã®ãã©ã¡ãŒã¿ãŒã§èµ·åãããããã¢ãã¿ãŒããæ€èšŒã«å¿ èŠãªãã¹ãŠã®æ å ±ãåéã§ããŸãã ãã€ç£èŠãéå§ãããã€åæ¢ããããåæè£ çœ®ã«äŒããã ãã§ååã§ãã
ã³ã³ãã€ã©ã®è¿œè·¡ã¯ãã¢ããªã±ãŒã·ã§ã³GUIãšã³ãã³ãã©ã€ã³ã®äž¡æ¹ããå®è¡ã§ããŸãã ããããã¹ãŠã®ä»çµã¿ãšæ°ããã¢ãŒãã®äœ¿çšæ¹æ³ã®è©³çŽ°ã«ã€ããŠã¯ãèšäºã§èª¬æããŠããŸãã
ãšãã²ããŒã»ãªãžã³ãã PVS-Studioã¯ãWindowsã®ãã«ãã·ã¹ãã ãšã³ã³ãã€ã©ããµããŒãããããã«ãªããŸããã ç°¡åã§ããã«äœ¿çšã§ããŸã ã
ãã®èšäºã§ã¯ãã³ãã³ãã©ã€ã³ã¢ãã¿ãªã³ã°ã®éå§ã¢ãŒãã§Qtãããžã§ã¯ãããã¹ãããæ¹æ³ã«ã€ããŠèª¬æããŸãã
誀解ãå°ãªããªãããã«ããã®èšäºãå¿ ããèªã¿ãã ããã ããšãã°ããããžã§ã¯ãã®ã³ã³ãã€ã«ãç£èŠãããŠããéãããã°ã©ãã³ã°ã䞊è¡ããŠè¡ãããšã¯ã§ããŸããã å¥ã®ãããžã§ã¯ããããã¡ã€ã«ãã³ã³ãã€ã«ãããšããããã«é¢ããæ å ±ãåéããããããããã§ãã¯ãããŸãã ãã®çµæãå¥ã®ãããžã§ã¯ãã«é¢é£ããã¡ãã»ãŒãžãã¬ããŒãã«å«ãŸããŸãã ããã¯æ··ä¹±ã«ãªããŸãã
æ€èšŒçµæ
äžè¬çã«ã次ã®ã³ãŒãã®å°è±¡ãåŸãŸããã
Qtã³ãŒãã¯é«å質ã§ãããå®éã«ã¯C ++èšèªã®å±éºãªæ©èœã«é¢é£ãããšã©ãŒã¯å«ãŸããŠããŸããã ããããå€ãã®æ®éã®ã¿ã€ããã¹ã
ãã®èšäºã¯ããããã§ãã·ã§ããªãºã ã«é¢ä¿ãªãããã¹ãŠã®éçºè ãã¿ã€ããã¹ãããããšããã瀺ããŠããŸãã éçã³ãŒãåæã®å©ç¹ã¯ã以åãçŸåšãããã§ãã ã¢ãã©ã€ã¶ãŒã1åã®å®è¡ã§10åã®ã¿ã€ããã¹ãèŠã€ãããšããŸãã ãã®ãããå®æçã«äœ¿çšããã°ãä»ã§ã¯æ°çŸãŸãã¯æ°åã®ééããé²ãããšãã§ããŸãã ããã¯éåžžã«æéã®ç¯çŽã«ãªããŸãã ã³ãŒãã®ãããã°æããŠãŒã¶ãŒããã®èŠæ ã®ãããã§ãšã©ãŒãèŠã€ããããããã³ãŒãã«ãšã©ãŒãçŸããçŽåŸã«ãšã©ãŒãæ€åºããæ¹ãã¯ããã«æçã§ãã
ã¿ã€ããã¹ã®çŽ æŽãããäžçã«é£ã³èŸŒã
ã¿ã€ããã¹N1
bool QWindowsUser32DLL::initTouch() { QSystemLibrary library(QStringLiteral("user32")); registerTouchWindow = ....; unregisterTouchWindow = ....; getTouchInputInfo = ....; closeTouchInputHandle = ....; return registerTouchWindow && unregisterTouchWindow && getTouchInputInfo && getTouchInputInfo; }
PVS-StudioèŠåïŒV501ã&&ãæŒç®åã®å·ŠåŽãšå³åŽã«åããµãè¡šçŸãgetTouchInputInfoãããããŸãã qwindowscontext.cpp 216
4ã€ã®å€æ°ã«å€ãå²ãåœãŠãããŠããŸãã ãããã®4ã€ã®å€æ°ã確èªããå¿ èŠããããŸãã ãã ããã¿ã€ããã¹ã®ããã3ã€ã ãããã§ãã¯ãããŸããæåŸã®è¡ã§ã¯ããgetTouchInputInfoãã®ä»£ããã«ãcloseTouchInputHandleããšèšè¿°ããå¿ èŠããããŸãã
ã¿ã€ããã¹N2
QWindowsNativeImage *QWindowsFontEngine::drawGDIGlyph(....) { .... int iw = gm.width.toInt(); int ih = gm.height.toInt(); if (iw <= 0 || iw <= 0) return 0; .... }
PVS-StudioèŠåïŒV501 '||'ã®å·Šå³ã«åããµãåŒããããŸã æŒç®åïŒiw <= 0 || iw <= 0 qwindowsfontengine.cpp 1095
å€æ° 'ih'ã«æ ŒçŽãããŠããé«ããã§ãã¯ã¯ãããŸããã
ã¿ã€ããã¹N3ãN4
ãã®ãšã©ãŒã¯ãã¹ãã«é©çšãããŸãã éçåæãåäœãã¹ããè£å®ããæ¹æ³ã®è¯ãäŸã§ãã ãã®ãããã¯ã®è©³çŽ°ïŒã éçåæãTDDãè£å®ããæ¹æ³ ã
inline bool qCompare(QImage const &t1, QImage const &t2, ....) { .... if (t1.width() != t2.width() || t2.height() != t2.height()) { .... }
èŠåPVS-StudioïŒV501 'ïŒ='æŒç®åã®å·Šå³ã«åãå¯æ¬¡åŒããããŸãïŒt2.heightïŒïŒïŒ= T2.heightïŒïŒqtest_gui.h 101
2ã€ã®ç»åãæ¯èŒããé¢æ°ã¯ããããã®é«ããæ£ããæ¯èŒããŸããã ãã£ãšçã«ããŸã£ããæ¯èŒããŸããã
Copy-Pasteã䜿çšããŠäŒæããããšã©ãŒã ãŸã£ããåãæ¯èŒããããäžã®åããã¡ã€ã«ã§èŠãããšãã§ããŸãïŒ135è¡ç®ïŒã
Typo N5
ã³ãŒããformattedã圢åŒã«ããããšãç³ãèš³ãããŸããã è¡ãé·ãããŸããã
void QXmlSimpleReader::setFeature( const QString& name, bool enable) { .... } else if ( name == QLatin1String( "http://trolltech.com/xml/features/report-start-end-entity") || name == QLatin1String( "http://trolltech.com/xml/features/report-start-end-entity")) { .... }
PVS-StudioèŠåïŒV501 '||'ã®å·Šå³ã«åããµãåŒããããŸã æŒç®åã qxml.cpp 3249
å€æ° 'name'ã¯ãåãæååãš2åæ¯èŒãããŸãã äžèšã®ã³ãŒãã«ã¯ãåæ§ã®æ¯èŒããããŸãã ããã§ãå€æ°ã¯æååã䜿çšããŠããã2ã€ãšæ¯èŒãããŸãã
- httpïŒ// trolltech.com / xml / features / report-whitespace-only-CharData
- httpïŒ// qt-project.org / xml / features / report-whitespace-only-CharData
- httpïŒ// trolltech.com / xml / features / report-start-end-entity
- httpïŒ// qt-project.org / xml / features / report-start-end-entity
QString DayTimeDuration::stringValue() const { .... if(!m_hours && !m_minutes && !m_seconds && !m_seconds) .... }
PVS-StudioèŠåïŒV501 '&&'æŒç®åã®å·Šå³ã«åãå¯æ¬¡åŒ 'ïŒM_seconds'ããããŸãã qdaytimeduration.cpp 148
ããªç§ãå¿ããŸããã ããªç§ã¯å€æ°ãm_msecondsãã«ä¿åãããŸãã ãã§ãã¯ã¯æ¬¡ã®ããã«ãªããŸãã
if(!m_hours && !m_minutes && !m_seconds && !m_mseconds)
ããªç§ã§ããã«3ã€ã®åäžã®ãšã©ãŒããããŸãã
- qdaytimeduration.cpp 170
- qduration.cpp 167
- qduration.cpp 189
QV4::ReturnedValue QQuickJSContext2DPrototype::method_getImageData( QV4::CallContext *ctx) { .... qreal x = ctx->callData->args[0].toNumber(); qreal y = ctx->callData->args[1].toNumber(); qreal w = ctx->callData->args[2].toNumber(); qreal h = ctx->callData->args[3].toNumber(); if (!qIsFinite(x) || !qIsFinite(y) || !qIsFinite(w) || !qIsFinite(w)) .... }
PVS-StudioèŠåïŒV501ã||ãã®å·Šå³ã«åãå¯è¡šçŸãïŒQIsFiniteïŒwïŒãããããŸã æŒç®åã qquickcontext2d.cpp 3305
å€æ° 'h'ã®æ€èšŒã¯ãããŸããã 代ããã«ãå€æ°ãwãã2åãã§ãã¯ãããŸãã
ã¿ã€ããã¹N11
AtomicComparator::ComparisonResult IntegerComparator::compare(const Item &o1, const AtomicComparator::Operator, const Item &o2) const { const Numeric *const num1 = o1.as<Numeric>(); const Numeric *const num2 = o1.as<Numeric>(); if(num1->isSigned() || num2->isSigned()) .... }
V656å€æ°ãnum1ãããnum2ãã¯ãåãé¢æ°ã®åŒã³åºãã«ãã£ãŠåæåãããŸãã ãããããšã©ãŒãŸãã¯æé©åãããŠããªãã³ãŒãã§ãã ão1.as <Numeric>ïŒïŒãåŒã®æ€æ»ãæ€èšããŠãã ããã è¡ã確èªããŠãã ããïŒ220ã221ãqatomiccomparators.cpp 221
å€æ°ãnum1ããšãnum2ãã¯åãå€ã§åæåãããŸãã ãããã®å€æ°ã¯äž¡æ¹ãšã以äžã§ãã§ãã¯ãããŸãã ããã¯çãããã§ãã çµå±ã®ãšããã1ã€ã®å€æ°ã®å€ã®ã¿ããã§ãã¯ããã ãã§ååã§ãã
ã»ãšãã©ã®å Žåãå€æ°ãnum2ãã¯ãåŒæ°ão2ãã䜿çšãããåŒã§åæåããå¿ èŠããããŸãã
const Numeric *const num1 = o1.as<Numeric>(); const Numeric *const num2 = o2.as<Numeric>();
ã¿ã€ããã¹N12
void Atlas::uploadBgra(Texture *texture) { const QRect &r = texture->atlasSubRect(); QImage image = texture->image(); if (image.format() != QImage::Format_ARGB32_Premultiplied || image.format() != QImage::Format_RGB32) { .... }
V547åŒã¯åžžã«çã§ãã ããã§ã¯ãããããã&&ãæŒç®åã䜿çšããå¿ èŠããããŸãã qsgatlastexture.cpp 271
ãã®ã³ãŒãã®æ¡ä»¶ã¯æå³ããããŸããã 圌女ã¯ãã€ãçå®ã§ãã ããã§äœãééã£ãŠããã®ããç解ããããããããã«ãç°¡åãªäŸã瀺ããŸãã
int a = ...; if (a != 1 || a != 2)
å€æ°ã¯åžžã«äœããšçãããããŸããã
æ£ããã³ãŒããã©ã®ããã«èŠãããããããŸããã ãã¶ã次ã®ããã«ãªããŸãïŒ
if (image.format() == QImage::Format_ARGB32_Premultiplied || image.format() == QImage::Format_RGB32) {
ãŸãã¯ïŒ
if (image.format() != QImage::Format_ARGB32_Premultiplied && image.format() != QImage::Format_RGB32) {
ã¿ã€ããã¹N13
void QDeclarativeStateGroupPrivate::setCurrentStateInternal( const QString &state, bool ignoreTrans) { .... QDeclarativeTransition *transition = (ignoreTrans || ignoreTrans) ? 0 : findTransition(currentState, state); .... }
PVS-StudioèŠåïŒV501 '||'ã®å·Šå³ã«åããµãåŒããããŸã æŒç®åïŒignoreTrans || ignoreTrans qdeclarativestategroup.cpp 442
ããã§äœããééã£ãŠããŸãã 圌ããå°åæãã©ã®ããã«æžãããã£ããã¯ãç§ã«ã¯æããã§ã¯ãããŸããã
ã¿ã€ããã¹N14
QV4::ReturnedValue QQuickJSContext2DPrototype::method_createPattern(....) { .... if (repetition == QStringLiteral("repeat") || repetition.isEmpty()) { pattern->patternRepeatX = true; pattern->patternRepeatY = true; } else if (repetition == QStringLiteral("repeat-x")) { pattern->patternRepeatX = true; } else if (repetition == QStringLiteral("repeat-y")) { pattern->patternRepeatY = true; } else if (repetition == QStringLiteral("no-repeat")) { pattern->patternRepeatY = false; pattern->patternRepeatY = false; } else { //TODO: exception: SYNTAX_ERR } .... }
PVS-Studioã®èŠåïŒV519 'pattern-> patternRepeatY'å€æ°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ1775ã1776ãqquickcontext2d.cpp 1776
å€æ° 'patternRepeatY'ã«2ã€ã®é£ç¶ããå²ãåœãŠãè¡ãããŸãã
pattern->patternRepeatY = false; pattern->patternRepeatY = false;
ç§ã¯ãããããã«æžãããã¹ãã ãšæãïŒ
} else if (repetition == QStringLiteral("no-repeat")) { pattern->patternRepeatX = false; pattern->patternRepeatY = false; } else {
C ++ã®èª€çš
ç§ãèšã£ãããã«ãã»ãšãã©ã®ééãã¯ããããã¿ã€ããã¹ã§ãã C ++èšèªã®äžé©åãªäœ¿çšã«é¢é£ãããšã©ãŒã¯ã»ãšãã©ãããŸããã ãããããã®ãããªãšã©ãŒãããã€ãèŠã€ãããŸããã
æäœã®åªå é äœã«é¢é£ããçŸãããšã©ãŒ
bool QConfFileSettingsPrivate::readIniLine(....) { .... char ch; while (i < dataLen && ((ch = data.at(i) != '\n') && ch != '\r')) ++i; .... }
V593ãA = BïŒ= Cãã®è¡šçŸãæ€èšããããšãæ€èšããŠãã ããã åŒã¯æ¬¡ã®ããã«èšç®ãããŸãïŒ 'A =ïŒBïŒ= CïŒ'ã qsettings.cpp 1702
ã«ãŒãã¯ãè¡ã®çµãããèŠã€ããããã«èšèšãããŠããŸãã è¡æ«æåã¯ãæåã\ nããŸãã¯ã\ rãã§ãã
æ¡ä»¶å ã§ãæåãååŸããã\ nãããã³ã\ rããšæ¯èŒããå¿ èŠããããŸãã ãšã©ãŒã¯ãæŒç®åãïŒ=ãã®åªå 床ãæŒç®åã=ãã®åªå 床ãããé«ãããã«çºçããŸãã ãã®ãããæåã³ãŒãã¯å€æ°ãchãã«æžã蟌ãŸããã®ã§ã¯ãªãããtrueããŸãã¯ãfalseãã«æžã蟌ãŸããŸãã ãã®çµæãæ¯èŒ '\ r'ã¯ãã¯ã圹å²ãæãããŸããã
ãšã©ãŒãç®ç«ã€ããã«ãã©ã±ãããé 眮ããŸãã
while (i < dataLen && ((ch = (data.at(i) != '\n')) && ch != '\r'))
ãšã©ãŒã®ãããã\ nãæåã®ã¿ãè¡ã®çµãããšèŠãªãããŸãã è¡ãæåã\ rãã§çµããå Žåãé¢æ°ã¯æ£ããæ©èœããŸããã
æ£ããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
while (i < dataLen && (ch = data.at(i)) != '\n' && ch != '\r')
粟床ã®äœäž
bool QWindowsTabletSupport::translateTabletPacketEvent() { .... const double radAzim = (packet.pkOrientation.orAzimuth / 10) * (M_PI / 180); .... }
V636ãpacket.pkOrientation.orAzimuth / 10ãåŒã¯ãæé»çã«ãintãåãããdoubleãåã«ãã£ã¹ããããŸããã åæ°éšåã®æ倱ãé¿ããããã«ãæ瀺çãªåãã£ã¹ãã®äœ¿çšãæ€èšããŠãã ããã äŸïŒdouble A =ïŒdoubleïŒïŒXïŒ/ Y;ã qwindowstabletsupport.cpp 467
å€æ°ãpacket.pkOrientation.orAzimuthãã®ã¿ã€ãã¯ãintãã§ãã ãã®æŽæ°å€æ°ã¯æ°å€10ã§é€ç®ãããŸããé€ç®ã®çµæããdoubleãåã®å€ãšçµã¿åãããŠäœ¿çšââãããããšã¯çãããã§ãã æçµçµæã¯ããdoubleãåã®å€æ°ã«ãæ ŒçŽãããŸãã
ãã®ãããªæŽæ°é€ç®ã¯å¿ ãããééãã§ã¯ãããŸããã ãããããã³ãŒãã¯æå³ãããšããã«æ£ç¢ºã«èšè¿°ãããŠããŸãã ããããå®è·µã瀺ãããã«ãããã¯å€ãã®å Žåãæ¬ é¥ã§ãããèšç®ã®ç²ŸåºŠã倱ãããŸãã
ããšãã°ãå€æ° 'packet.pkOrientation.orAzimuth'ã55ãšãããšãèšç®çµæã¯æ¬¡ã®ããã«ãªããŸãã
ïŒ55/10ïŒ*ïŒ3.14159 ... / 180ïŒ= 5 * 0.01745 ... = 0.087266 ...
粟床ãå€§å¹ ã«é«ããããšãã§ããŸãã å®æ°10ãdoubleåãšããŠå®£èšããã ãã§ååã§ãïŒ "ïŒpacket.pkOrientation.orAzimuth / 10.0 ïŒ*ïŒM_PI / 180ïŒ"ã èšç®ã®çµæã¯æ¬¡ã®ãšããã§ãã
ïŒ55 / 10.0ïŒ*ïŒ3.14159 ... / 180ïŒ= 5.5 * 0.01745 ... = 0.095993 ...
ããã°ã©ãã¯ç°ãªãã¿ã€ãã®å€æ°ãæ··åšããåŒã«æ³šæãæããªãããããã®ãããªäžæ£ç¢ºãããã°ãã°çºçããŸãã ãã®ãããªäžæ³šæã¯ãå€ãã®å Žå64ããããšã©ãŒã«ãã€ãªãããŸãïŒ æ··åæŒç®ãåç §ïŒã
ã¢ãã©ã€ã¶ãŒã¯ãããã«51ã®çãããæŽæ°é€ç®ãæ€åºããŸãã ãããããäžéšã®åŒã¯éçºè ãæãã§ãããã®ãããæ£ç¢ºã§ã¯ãªãã§ãããã ãããããªã¹ãããŸãïŒ qt-v636.txt ã
ç¡æå³ãªãã€ã³ã¿ãŒãã§ãã¯
ãnewãæŒç®åã䜿çšããŠã¡ã¢ãªãå²ãåœãŠãããå Žåãé·ãéããŒãã«çãããã€ã³ã¿ããã§ãã¯ããããšã¯æå³ããããŸããã ã¡ã¢ãªãå²ãåœãŠãããšãã§ããªãå ŽåãäŸå€ãã¹ããŒãããŸãã ãã¡ãããæŒç®å 'new'ã0ãè¿ãããã«ããããšãã§ããŸãããããã§ã¯ãããã®ã±ãŒã¹ã«ã€ããŠã¯èª¬æããŸããã
ãã ããããã°ã©ããŒã¯æã å¿ããŠããŸããç¡æå³ãªãã§ãã¯ãã³ãŒãã«åã³çŸããŸãã
HRESULT STDMETHODCALLTYPE QWindowsEnumerate::Clone( IEnumVARIANT **ppEnum) { QWindowsEnumerate *penum = 0; *ppEnum = 0; penum = new QWindowsEnumerate(array); if (!penum) return E_OUTOFMEMORY; .... }
PVS-StudioèŠåïŒV668ã¡ã¢ãªããæ°ãããæŒç®åã䜿çšããŠå²ãåœãŠãããããããããã ããã€ã³ã¿ãŒãnullã«å¯ŸããŠãã¹ãããæå³ããããŸããã ã¡ã¢ãªå²ãåœãŠãšã©ãŒã®å ŽåãäŸå€ãçæãããŸãã qwindowsmsaaaccessible.cpp 141
ãã®ãããªãã§ãã¯ãããã€ããããŸãïŒmain.cpp 127ãqaudiodevicefactory.cpp 236ãqaudiodevicefactory.cpp 263ãqaudiobuffer.cpp 488ãmfvideorenderercontrol.cpp 143ãmfvideorenderercontrol.cpp 158ãmfvideorenderercontrol.cppprefpppprev 11 ãpositionpollfactory.cpp 60ã
ããŒã¯ãµã€ã
ããã¯ééãã ãšã¯èšããªãã³ãŒãã2ã€ãããŸãã ãããžã§ã¯ãã®ã¢ãŒããã¯ãã£ãšå®è£ ã®æ©èœãããããŸããã ãã ãããããããšã©ãŒã§ã¯ãªãå Žåã§ããããã¯C ++ããã°ã©ãã³ã°ã®æ¬ ç¹ã§ãã
class Q_CORE_EXPORT QObject { .... virtual ~QObject(); virtual bool event(QEvent *); virtual bool eventFilter(QObject *, QEvent *); .... }; QObject *QQmlVME::run(....) { .... QObject *o = (QObject *)operator new(instr.typeSize + sizeof(QQmlData)); ::memset(static_cast<void *>(o), 0, instr.typeSize + sizeof(QQmlData)); .... }
PVS-StudioèŠåïŒV598ãmemsetãé¢æ°ã¯ããQObjectãã¯ã©ã¹ã®ãã£ãŒã«ããç¡å¹ã«ããããã«äœ¿çšãããŸãã ããã«ãããä»®æ³ã¡ãœããããŒãã«ãç ŽæããŸãã qqmlvme.cpp 658
QObjectã¯ã©ã¹ã«ã¯ä»®æ³é¢æ°ããããŸãã ããã¯ããªããžã§ã¯ããä»®æ³ã¡ãœããã®ããŒãã«ãžã®ãã€ã³ã¿ãŒãæ ŒçŽããããšãæå³ããŸãã memsetïŒïŒé¢æ°ã䜿çšããŠãã®ãããªãªããžã§ã¯ããåæåããããšã¯ãç§ã«ã¯è¯ãèãã§ã¯ãªãããã§ãã
å¥ã®èŠåïŒV598ãmemsetãé¢æ°ã¯ããQObjectãã¯ã©ã¹ã®ãã£ãŒã«ããç¡å¹ã«ããããã«äœ¿çšãããŸãã ããã«ãããä»®æ³ã¡ãœããããŒãã«ãç ŽæããŸãã qdeclarativevme.cpp 286
NULLãã€ã³ã¿ãŒã®éåç §
ããããããããã®ãšã©ãŒã¯ã¿ã€ããã¹ã«èµ·å ããå¯èœæ§ããããŸãã ããããç§ã¯ããããå¥ã®ã°ã«ãŒãã«åããã®ã奜ãã§ãã ãããã£ãŠã圌ãã¯ããæããããæ·±å»ã«èŠããŸãã
ã泚æ ãšã©ãŒãã°ã«ãŒãã«åå²ããããšã¯åžžã«ããªãarbitraryæçã§ãã å€ãã®å Žåãåããšã©ãŒã¯ãã¿ã€ããã¹ãè匱æ§ãé åã®ç¯å²å€ãªã©ã«åé¡ãããŸãã
NULLãã€ã³ã¿ãŒã«æ»ããŸãããã
ã¿ã€ããã¹ã«ãã誀åè±åç §
QV4::ReturnedValue QQuickJSContext2DPixelData::getIndexed( QV4::Managed *m, uint index, bool *hasProperty) { .... if (!m) return m->engine()->currentContext()->throwTypeError(); .... }
PVS-StudioèŠåïŒV522ãã«ãã€ã³ã¿ãŒãmãã®éåç §ãè¡ãããå ŽåããããŸãã qquickcontext2d.cpp 3169
ã©ããããæŒç®å 'ïŒ' ããã¯äžèŠã§ãã æ·±å»ãªééãã«ã€ãªããåçŽãªã¿ã€ããã¹ã
ãšã©ãŒãã³ãã©ãŒã§ã®NULLãã€ã³ã¿ãŒéåç §
void QDocIndexFiles::readIndexSection(....) { .... DocNode* dn = qdb_->findGroup(groupNames[i]); if (dn) { dn->addMember(node); } else { .... qDebug() << "DID NOT FIND GROUP:" << dn->name() << "for:" << node->name(); } .... }
PVS-StudioèŠåïŒV522 nullãã€ã³ã¿ãŒ 'dn'ã®éåç §ãè¡ãããå ŽåããããŸãã qdocindexfiles.cpp 539
ãšã©ãŒãçºçããå Žåã蚺æã¡ãã»ãŒãžãåºåãããŸãã 圌ãã¯ãã®äžã«ååšããªããªããžã§ã¯ãããååãååŸããããšããŸãïŒdn-> nameïŒïŒã
82ã®æœåšçãªNULLãã€ã³ã¿ãŒéåç §
Qtãå«ãã»ãšãã©ãã¹ãŠã®ãããžã§ã¯ãã§ã¯ãnullãã€ã³ã¿ãŒã®æäœã«æ¬ é¥ããããŸãã å€ãã®å Žåããã€ã³ã¿ãŒã䜿çšãããåŸã«æ€èšŒãå®è¡ãããŸãã ããã¯å¿ ãããééãã§ã¯ãããŸããã ååãšããŠããã€ã³ã¿ããŒãã«çããããããšã¯ã§ããŸããã
ãããã«ããããã®ãããªå Žæã¯ç 究ãããªãã¡ã¯ã¿ãªã³ã°ããã«å€ããŸãã ãšã©ãŒããªããŠãããã€ã³ã¿ãŒãäœåã«ãã§ãã¯ãããšãã³ãŒããèªã¿åããšãã«ããã°ã©ããæ··ä¹±ããŸãã
å±éºãªã³ãŒãã®æçã®1ã€ãèããŠã¿ãŸãããã
static int gray_raster_render(....) { const QT_FT_Outline* outline = (const QT_FT_Outline*)params->source; .... /* return immediately if the outline is empty */ if ( outline->n_points == 0 || outline->n_contours <= 0 ) return 0; if ( !outline || !outline->contours || !outline->points ) return ErrRaster_Invalid_Outline; .... }
PVS-StudioèŠåïŒV595 nullptrã«å¯ŸããŠæ€èšŒãããåã«ããã¢ãŠãã©ã€ã³ããã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªããŠãã ããïŒ1746ã1749ãqgrayraster.c 1746
gray_raster_renderïŒïŒé¢æ°ãæé©åããããšããç¬éã«ãšã©ãŒãçºçãããšæããŸãã ã»ãšãã©ã®å Žåããã§ã«å®æããæ©èœã³ãŒãã«æ¬¡ã®è¡ãæ¿å ¥ãããŠããŸãã
/* return immediately if the outline is empty */ if ( outline->n_points == 0 || outline->n_contours <= 0 ) return 0;
åé¡ã¯ããã¢ãŠãã©ã€ã³ããã€ã³ã¿ãŒããã«ã«ãªãå¯èœæ§ãããããšã§ãã ãã€ã³ã¿ãŒããŒãã§ããããšã確èªããã®ã¯å°ãäœããªããŸãã
ã¢ãã©ã€ã¶ãŒã¯ãããã«81ã®æœåšçãªãšã©ãŒãçºèŠããŸããã 蚺æã¡ãã»ãŒãžããªã¹ããšããŠæäŸããŸãïŒ qt-v595.txt ã
æªåçã®è³ªå
å¥åŠãªã³ãŒãã®æçããããããããã©ã®ããã«çŸããå®éã«æžãããããšããŠããã®ããèšãã®ã¯å°é£ã§ãã ããããããããã¯ã¿ã€ããã¹ãããããäžå®å šãªã³ãŒãããããã倱æãããªãã¡ã¯ã¿ãªã³ã°ã§ãã
å確èª
QWindowsFontEngine::~QWindowsFontEngine() { .... if (QWindowsContext::verboseFonts) if (QWindowsContext::verboseFonts) qDebug("%s: font='%s", __FUNCTION__, qPrintable(_name)); .... }
PVS-StudioèŠåïŒV571ç¹°ãè¿ããã§ãã¯ã 'ifïŒQWindowsContext :: verboseFontsïŒ'æ¡ä»¶ã¯ã369è¡ç®ã§æ¢ã«æ€èšŒãããŠããŸããqwindowsfontengine.cpp 370
ãªãåãããšãå確èªããã®ã§ããïŒ ããããã1ã€ã®ãã§ãã¯ã¯äžèŠã§ãã ããããä»ã®äœãããã§ãã¯ããã®ãå¿ããŠããã®ã§ãããã
ããã«å²ãåœãŠ
void Moc::parse() { .... index = def.begin + 1; namespaceList += def; index = rewind; .... }
PVS-StudioèŠåïŒV519ãã€ã³ããã¯ã¹ãå€æ°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ568ã570ãmoc.cpp 570
å€æ° 'index'ã«ç°ãªãå€ãå²ãåœãŠãããã®ã¯ãªãã§ããïŒ
ä»ã«ã䌌ããããªå¥åŠãªã³ãŒãã¹ãããããããã€ããããŸãã
- V519ãexitCodeãå€æ°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ807ã815ãqprocess.cpp 815
- V519ãæ€åºãå€æ°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ163ã164ãqhoversensorgesturerecognizer.cpp 164
- V519ãincreaseCountãå€æ°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ185ã186ãqtwistsensorgesturerecognizer.cpp 186
bool GSuggestCompletion::eventFilter(QObject *obj, QEvent *ev) { .... switch (key) { case Qt::Key_Enter: case Qt::Key_Return: doneCompletion(); consumed = true; case Qt::Key_Escape: editor->setFocus(); popup->hide(); consumed = true; case Qt::Key_Up: case Qt::Key_Down: case Qt::Key_Home: case Qt::Key_End: case Qt::Key_PageUp: case Qt::Key_PageDown: break; .... }
PVS-StudioèŠåïŒV519ãæ¶è²»ãå€æ°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªïŒ110ã115ãgooglesuggest.cpp 115
ããã§breakã¹ããŒãã¡ã³ããå¿ããŸãããïŒ
ã¢ãã©ã€ã¶ãŒã«ãšã£ãŠã¯ãå€æ°ãconsumedãã«å€ãtrueããé£ç¶ããŠ2åå²ãåœãŠãããšãã§ããã®ã¯å¥åŠã«æããŸããã ããã§breakã¹ããŒãã¡ã³ããå¿ããŠããå¯èœæ§ããããŸãã ããããç§ã¯ããããããŸããã ãããããæåã®å²ãåœãŠãconsumed = true;ããåé€ããå¿ èŠãããã ãã§ãã
è¿œå ã®breakã¹ããŒãã¡ã³ãã®çã
bool QHelpGenerator::registerVirtualFolder(....) { .... while (d->query->next()) { d->namespaceId = d->query->value(0).toInt(); break; } .... }
PVS-StudioèŠåïŒV612ã«ãŒãå ã®ç¡æ¡ä»¶ã®ããã¬ãŒã¯ãã qhelpgenerator.cpp 429
ãbreakãã¹ããŒãã¡ã³ããåå ã§ã«ãŒããããã«åæ¢ããã®ã¯æ£ããã§ããïŒ
å¥ã®ãã®ãããªã³ãŒããããã«ãããŸãïŒqhelpgenerator.cpp 642
éå€
ææ ¢ããŠãã ããã èšäºã¯éããªãçµäºããŸãã ãŸã ããã€ãã®éå€ãªãšã©ãŒããããŸãã
toLowerïŒïŒé¢æ°ã®èª€ã£ã䜿çš
int main(int argc, char **argv) { .... QByteArray arg(argv[a]); .... arg = arg.mid(1); arg.toLower(); if (arg == "o") .... }
PVS-StudioèŠåïŒV530é¢æ° 'toLower'ã®æ»ãå€ã䜿çšããå¿ èŠããããŸãã main.cpp 72
ãtoLowerïŒïŒãé¢æ°ã¯ãªããžã§ã¯ããå€æŽããŸããã å°æåãæ ŒçŽãããªããžã§ã¯ãã®ã³ããŒãè¿ããŸãã
å¥ã®ééãïŒV530é¢æ° 'toLower'ã®æ»ãå€ã䜿çšããå¿ èŠããããŸãã main.cpp 1522
é åã®å¢çãè¶ãã
ç¶æ³ã¯è€éã§ãã éäžããŠãã ããã
ãã®ãããªçªå·ä»ãã¿ã€ãããããŸãïŒ
typedef enum { JNone, JCausing, JDual, JRight, JTransparent } Joining;
JTransparent == 4ã§ããããšãå¿ããªãã§ãã ããã
次ã«ãgetNkoJoiningïŒïŒé¢æ°ãæ€èšããŸãã
static Joining getNkoJoining(unsigned short uc) { if (uc < 0x7ca) return JNone; if (uc <= 0x7ea) return JDual; if (uc <= 0x7f3) return JTransparent; if (uc <= 0x7f9) return JNone; if (uc == 0x7fa) return JCausing; return JNone; }
ç§ãã¡ã«ãšã£ãŠéèŠãªã®ã¯ããã®é¢æ°ããJTransparentããè¿ãããšãã§ãããšããããšã§ãã ã€ãŸããé¢æ°ã¯4ãè¿ãããšãã§ããŸãã
ããã°ã©ã ã«ã¯ã2次å é åãjoining_tableãããããŸãã
static const JoiningPair joining_table[5][4] = { .... };
ãããŠä»ããšã©ãŒãçºçããå®éã®å ŽæïŒ
static void getNkoProperties(....) { .... Joining j = getNkoJoining(chars[0]); ArabicShape shape = joining_table[XIsolated][j].form2; .... }
PVS-StudioèŠåïŒV557ã¢ã¬ã€ããªãŒããŒã©ã³ããå¯èœæ§ããããŸãã ãjãã€ã³ããã¯ã¹ã®å€ã¯4ã«éããå¯èœæ§ããããŸããharfbuzz-arabic.c 516
æãåºããšãgetNkoJoiningïŒïŒé¢æ°ã¯å€4ãè¿ãããšãã§ããŸãããããã£ãŠãjoining_table [...] [4]é åã®ã»ã«ãåç §ããŸãã ããã¯èš±ãããŸããã é åã¯é åã®å¢çãè¶ ããŸãã
åãæ¡ä»¶
void Node::setPageType(const QString& t) { if ((t == "API") || (t == "api")) pageType_ = ApiPage; else if (t == "howto") pageType_ = HowToPage; else if (t == "overview") pageType_ = OverviewPage; else if (t == "tutorial") pageType_ = TutorialPage; else if (t == "howto") pageType_ = HowToPage; else if (t == "article") pageType_ = ArticlePage; else if (t == "example") pageType_ = ExamplePage; else if (t == "ditamap") pageType_ = DitaMapPage; }
PVS-StudioèŠåïŒV517ãifïŒAïŒ{...} else ifïŒAïŒ{...}ããã¿ãŒã³ã®äœ¿çšãæ€åºãããŸããã è«çãšã©ãŒãååšããå¯èœæ§ããããŸãã è¡ã確èªããŠãã ããïŒ386ã392ãnode.cpp 386
ãã§ãã¯ã¯2åå®è¡ãããŸãïŒt == "howto"ïŒã ãããã®1ã€ã¯äœåã ãšæããŸãã
åæ§ã®èŠåãããã€ããããŸãã
- V517ãifïŒAïŒ{...} else ifïŒAïŒ{...}ããã¿ãŒã³ã®äœ¿çšãæ€åºãããŸããã è«çãšã©ãŒãååšããå¯èœæ§ããããŸãã è¡ã確èªããŠãã ããïŒ188ã195ãqmaintainingreader_tpl_p.h 188
- V517ãifïŒAïŒ{...} else ifïŒAïŒ{...}ããã¿ãŒã³ã®äœ¿çšãæ€åºãããŸããã è«çãšã©ãŒãååšããå¯èœæ§ããããŸãã è¡ã確èªïŒ299ã303ãmfmetadatacontrol.cpp 299
void QBluetoothServiceDiscoveryAgentPrivate::_q_deviceDiscovered( const QBluetoothDeviceInfo &info) { if(mode == QBluetoothServiceDiscoveryAgent::FullDiscovery) { for(int i = 0; i < discoveredDevices.count(); i++){ if(discoveredDevices.at(i).address() == info.address()){ discoveredDevices.removeAt(i); } } discoveredDevices.prepend(info); } else { for(int i = 0; i < discoveredDevices.count(); i++){ if(discoveredDevices.at(i).address() == info.address()){ discoveredDevices.removeAt(i); } } discoveredDevices.prepend(info); } }
PVS-StudioèŠåïŒV523ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ãã qbluetoothservicediscoveryagent.cpp 402
æ¡ä»¶ã«é¢ä¿ãªããåãã¢ã¯ã·ã§ã³ãå®è¡ãããŸãã
åæ§ã«ïŒpcre_exec.c 5577ãditaxmlgenerator.cpp 1722ãhtmlgenerator.cpp 388ã
ç¶æ¿ããããšã©ãŒ
Qtã¯ããã€ãã®ãµãŒãããŒãã£ã©ã€ãã©ãªã䜿çšããŸãã ãããã®ã©ã€ãã©ãªã«ããšã©ãŒããããŸãã ãããã®ãšã©ãŒã¯Qtã«ãããããšãããããŸãã èšäºã§ã¯ãããã«ã€ããŠã¯èª¬æããŸããã§ããããèšåããããšã決ããŸããã
ç§ã¯ãµãŒãããŒãã£ã®ã©ã€ãã©ãªã泚ææ·±ãèŠãŸããã§ããããäœããæžããŸããïŒ qt-3rdparty.txt ã
ã泚æ ãã ããQtãéåžžã«æ³šææ·±ãèŠããšã¯æããªãã§ãã ããã ãã®ãããªèšäºãæžãã«ã¯ã倧èŠæš¡ã§è¡šé¢çãªæ€æ»ã®ãããžã§ã¯ãã§ååã§ãã
çµè«
PVS-Studioã¯ãQtãã¬ãŒã ã¯ãŒã¯ãªã©ã®é«å質ã§æŽç·Žããããããžã§ã¯ãã§ããšã©ãŒãæ€åºã§ããåªãã匷åãªã¢ãã©ã€ã¶ãŒã§ãã
åæ段éã§å€ãã®ãšã©ãŒãæ€åºããããšã§ãéçºããŒã ã®æéãå€§å¹ ã«ç¯çŽã§ããŸãã ã€ã³ã¯ãªã¡ã³ã¿ã«åæã䜿çšãããšããã¡ã€ã«ãã³ã³ãã€ã«ããçŽåŸã«ãšã©ãŒãæ€åºãããŸãã
ãµã€ããªã³ã¯
- ãªãŒãã³ãœãŒã¹ãããžã§ã¯ããå®æçã«ãã§ãã¯ããŠããŸãã ããšãã°ãTorãChromiumãClangãFirebirdãOpenCVã èå³ã®ããæ¹ã¯ãã PVS-Studioã䜿çšããŠãã¹ããããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®ææ°ãªã¹ã ããã芧ãã ããã
- ããã§ã¯ãPVS-Studioã®è©ŠçšçãããŠã³ããŒãã§ããŸã ã æåã¯ãã¢ã©ãŒããããã²ãŒãããããã«20åã¯ãªãã¯ããŸãã èªåã«é¢ããæ å ±ãå ±åããåŸãããã«200ã¯ãªãã¯ããŸãã
ãã®èšäºã¯è±èªã§ãã
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãªã³ã¯ã䜿çšããŠãã ããïŒAndrey Karpovã Qt 5ãã¬ãŒã ã¯ãŒã¯ã®ç¢ºèª ã
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§ãããã«å¯ŸããåçãåéããŸããïŒ PVS-Studioããã³CppCatããŒãžã§ã³2014ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã