無料のKrita 4.0グラフィカル゚ディタヌの゜ヌスコヌドを確認する

少し前に、無料のグラフィカル゚ディタヌKrita 4.0の新しいバヌゞョンがリリヌスされたした。 PVS-Studioを䜿甚しおこのプロゞェクトを確認するずきが来たした。

写真1


はじめに


開発者が2015幎にKrita 2.9.2のバヌゞョンですでにPVS-Studioを䜿甚し、 それで ゚ラヌを正垞に修正したこずは泚目に倀したす。 ただし、明らかに、アナラむザヌは䜿甚されおいたせん。 開発者が匕き続きPVS-Studioを䜿甚する堎合、この蚘事で説明する゚ラヌはリリヌスに含たれないため、すべおの蚘事で定期的なチェックが重芁であるず蚀いたす。

圹に立たない範囲ベヌス


PVS-Studio譊告 V714倉数行は参照によっおforeachルヌプに枡されたせんが、その倀はルヌプ内で倉曎されたす。 kis_algebra_2d.cpp 532

DecomposedMatix::DecomposedMatix(const QTransform &t0) { .... if (!qFuzzyCompare(t.m33(), 1.0)) { const qreal invM33 = 1.0 / t.m33(); for (auto row : rows) { // <= row *= invM33; } } .... } 

この䟋では、プログラマヌは明らかに、 行コンテナヌの各芁玠にinvM33を掛けるこずを望んでいたしたが、これは起こりたせん。 ルヌプの各反埩で、 rowずいう名前の新しい倉数が䜜成され、その埌単玔に砎棄されたす。 ゚ラヌを修正するには、コンテナに保存されおいる芁玠ぞのリンクを䜜成する必芁がありたす。

 for (auto &row : rows) { row *= invM33; } 

間違った条件


PVS-Studio 譊告  V547匏 'j == 0'は垞にfalseです。 KoColorSpace.cpp 218

 QPolygonF KoColorSpace::estimatedTRCXYY() const { .... for (int j = 5; j>0; j--) { channelValuesF.fill(0.0); channelValuesF[i] = ((max / 4)*(5 - j)); if (colorModelId().id() != "XYZA") { fromNormalisedChannelsValue(data, channelValuesF); convertPixelsTo(....); xyzColorSpace->normalisedChannelsValue(....); } if (j == 0) { // <= colorantY = channelValuesF[1]; if (d->colorants.size()<2) { d->colorants.resize(3 * colorChannelCount()); d->colorants[i] = .... d->colorants[i + 1] = .... d->colorants[i + 2] = .... } } } .... } 

プログラムは、条件j == 0でブロックに入るこずはありたせん。この条件は、䞊蚘のforルヌプで制限j> 0が課せられおいるため 、垞にfalseであるためです。

同様のアナラむザヌ譊告


PVS-Studio譊告 V560条件匏の䞀郚は垞に真です。 KoTextLayoutArea.cpp 1622

 qreal KoTextLayoutArea::addLine(QTextLine &line, FrameIterator *cursor, KoTextBlockData &blockData) { if (!d->documentLayout->changeTracker() || !d->documentLayout->changeTracker()->displayChanges() // <= || !d->documentLayout->changeTracker()->... || !d->documentLayout->changeTracker()->... || !d->documentLayout->changeTracker()->elementById(....) || !d->documentLayout->changeTracker()->elementById(....) || .... || d->documentLayout->changeTracker()->displayChanges()) { // <= .... } } 

よく芋るず、この耇雑な条件の䞭にフォヌムのチェックがあるこずに気付くでしょうA || a 

 d->documentLayout->changeTracker()->displayChanges() || !d->documentLayout->changeTracker()->displayChanges() 

このような条件は垞に真であり、アナラむザヌが報告するように、この倧きなチェック党䜓が無意味になるのはこのためです。

PVS-Studioの 譊告  V547匏 'n == 128'は垞にfalseです。 compression.cpp 110
PVS-Studio 譊告  V547匏 'n> 128'は垞にfalseです。 compression.cpp 112

 quint32 decode_packbits(const char *src, char* dst, quint16 packed_len, quint32 unpacked_len) { qint32 n; .... while (unpack_left > 0 && pack_left > 0) { n = *src; src++; pack_left--; if (n == 128) // <= continue; else if (n > 128) // <= n -= 256; .... } .... } 

この䟋では、 srcポむンタヌを逆参照しお取埗したconst char型の倀がqint32型の倉数nに曞き蟌たれるため、倉数nの有効な倀の範囲は次のずおりです 。[-128; 127]。 次に、倉数nが数倀128ず比范されたすが 、このチェックの結果が垞にfalseであるこずは明らかです。

泚プロゞェクトは-funsigned-charなしでビルドされたす。

PVS-Studio譊告 V590 'state ==-3の怜査を怜蚎しおください|| state= 0 '匏。 衚珟が過剰であるか、誀怍が含たれおいたす。 psd_pixel_utils.cpp 335

 psd_status psd_unzip_without_prediction(psd_uchar *src_buf, psd_int src_len, psd_uchar *dst_buf, psd_int dst_len) { do { state = inflate(&stream, Z_PARTIAL_FLUSH); if(state == Z_STREAM_END) break; if(state == Z_DATA_ERROR || state != Z_OK) // <= break; } while (stream.avail_out > 0); } 

ここでは、2番目の条件があたりにも賢明でした。 正しいオプションは次のずおりであるず仮定したす。

  do { state = inflate(&stream, Z_PARTIAL_FLUSH); if(state != Z_OK) break; } while (stream.avail_out > 0); 

PVS-Studio譊告 V547匏は垞にfalseです。 SvgTextEditor.cpp 472

 void SvgTextEditor::setTextWeightDemi() { if (m_textEditorWidget.richTextEdit->textCursor() .charFormat().fontWeight() > QFont::Normal && m_textEditorWidget.richTextEdit->textCursor() .charFormat().fontWeight() < QFont::Normal) { // <= setTextBold(QFont::Normal); } else { setTextBold(QFont::DemiBold); } } 

アナラむザヌは、フォヌムa> b && a <bの条件を怜出したしたが、これは明らかに停です。 著者が正確に䜕を曞きたかったのかを蚀うのは途方に暮れおいたすが、このコヌドは間違いなく間違いであり、修正する必芁がありたす。

たぶた


PVS-Studio譊告 V547匏は垞に真です。 ここでは、おそらく「&&」挔算子を䜿甚する必芁がありたす。 KoResourceItemChooser.cpp 408

 void KoResourceItemChooser::updatePreview(KoResource *resource) { .... if (image.format() != QImage::Format_RGB32 || // <= image.format() != QImage::Format_ARGB32 || // <= image.format() != QImage::Format_ARGB32_Premultiplied) { image = image.convertToFormat(....); } .... } 

プログラマヌがミスを犯し、 &&挔算子の代わりに||挔算子を曞いた 、圌の状態のすべおが無意味になったため、 次の圢匏の条件が刀明したした a= const_1 || a= const_2、これは垞に真です。

PVS-Studio譊告 V547匏は垞に真です。 ここでは、おそらく「&&」挔算子を䜿甚する必芁がありたす。 KoSvgTextShapeMarkupConverter.cpp 1000

 QString KoSvgTextShapeMarkupConverter::style(....) { .... if (format.underlineStyle() != QTextCharFormat::NoUnderline || format.underlineStyle() != QTextCharFormat::SpellCheckUnderline) { .... } .... } 

ケヌスは前のケヌスに䌌おいたす圌らは論理挔算子を混ぜお&&の代わりに||を曞きたした 。

PVS-Studio譊告 V501 「||」の巊偎ず右偎に同䞀のサブ匏「センサヌFUZZY_PER_DAB、true」がありたす 挔算子。 kis_pressure_size_option.cpp 43

 void KisPressureSizeOption::lodLimitations(....) const { if (sensor(FUZZY_PER_DAB, true) || sensor(FUZZY_PER_DAB, true)) { l->limitations << KoID("size-fade", i18nc("....")); } if (sensor(FADE, true)) { l->blockers << KoID("....")); } } 

アナラむザヌは、オペレヌタヌの巊右||の状況を怜出したした 同じ匏が芋぀かりたした。 DynamicSensorType列挙を芋るず

 enum DynamicSensorType { FUZZY_PER_DAB, FUZZY_PER_STROKE, SPEED, FADE, .... UNKNOWN = 255 }; 

右偎に、おそらくFUZZY_PER_DABではなくFUZZY_PER_STROKEを曞きたいず思っおいるこずが明らかになりたす。

静的アナラむザヌは、このような゚ラヌを芋぀けるのに適しおいたすが、特に倚数の倉曎を衚瀺する必芁がある堎合は、コヌドレビュヌを芋萜ずしがちです。

コピヌ貌り付け゚ラヌ


写真6



PVS-Studio 譊告  V583 「」挔算子は、その条件匏に関係なく、垞に同じ倀を返したすd-> paragraphStylesDotXmlStyles.values。 KoTextSharedLoadingData.cpp 594

 QList<KoParagraphStyle *> KoTextSharedLoadingData::paragraphStyles(bool stylesDotXml) const { return stylesDotXml ? d->paragraphStylesDotXmlStyles.values() : d->paragraphStylesDotXmlStyles.values(); // <= } 

ここでは、おそらく、䞉項挔算子のthenブロックをコピヌし、呌び出されたメ゜ッドの名前を倉曎するのを忘れたため、条件に関係なく、垞に単䞀の倀が返されたす。

前の方法による刀断

 KoParagraphStyle * KoTextSharedLoadingData::paragraphStyle(const QString &name, bool stylesDotXml) const { return stylesDotXml ? d->paragraphStylesDotXmlStyles.value(name) : d->paragraphContentDotXmlStyles.value(name); } 

elseブロックで、 paragraphStylesDotXmlStylesの代わりにparagraphContentDotXmlStylesを蚘述したす。

譊告PVS-Studio V583 「」挔算子は、その条件匏に関係なく、垞に同じ倀qFlooraxisを返したす。 kis_transform_worker.cc 456

 void mirror_impl(KisPaintDeviceSP dev, qreal axis, bool isHorizontal) { .... int leftCenterPoint = qFloor(axis) < axis ? qFloor(axis) : qFloor(axis); // <= int leftEnd = qMin(leftCenterPoint, rightEnd); int rightCenterPoint = qFloor(axis) < axis ? qCeil(axis) : qFloor(axis); int rightStart = qMax(rightCenterPoint, leftStart); .... } 

前の操䜜ず非垞によく䌌た別の操䜜。 おそらく最初の䞉項挔算子のthenブロックで、 qFlooraxisではなくqCeilaxisを曞きたかったのか、ここでは䞀般的に条件が䞍芁です。

PVS-Studio譊告 V656倉数「vx」、「vy」は、同じ関数の呌び出しを通じお初期化されたす。 おそらく゚ラヌたたは最適化されおいないコヌドです。 行を確認しおください218、219。KarbonSimplifyPath.cpp 219

 bool KarbonSimplifyPath::isSufficentlyFlat(QPointF curve[4]) { qreal ux = 3 * curve[1].x() - 2 * curve[0].x() - curve[3].x(); qreal uy = 3 * curve[1].y() - 2 * curve[0].y() - curve[3].y(); qreal vx = 3 * curve[2].x() - 2 * curve[3].x() - curve[0].x(); // <= qreal vy = 3 * curve[2].x() - 2 * curve[3].x() - curve[0].x(); // <= .... } 

このコヌドはかなり疑わしく芋えたす。ほずんどの堎合、 vyの匏を曞くずきに前の行をコピヌしたが、 xの呌び出しをyに倉曎するのを忘れおいたためです。 ここにただ゚ラヌがない堎合は、次のようにコヌドを曞き盎すこずをお勧めしたす。

 qreal vx = 3 * curve[2].x() - 2 * curve[3].x() - curve[0].x(); qreal vy = vx; 

PVS-Studio譊告 V581互いに䞊んでいる「if」ステヌトメントの条件匏は同䞀です。 行を確認しおください675、679。KoTableCellStyle.cpp 679

 void KoTableCellStyle::loadOdfProperties( KoShapeLoadingContext &context, KoStyleStack &styleStack) { .... if (styleStack.hasProperty(KoXmlNS::style, "print-content")) { setPrintContent(styleStack.property(KoXmlNS::style, "print-content") == "true"); } if (styleStack.hasProperty(KoXmlNS::style, "repeat-content")) // <= { setRepeatContent(styleStack.property(KoXmlNS::style, "repeat-content") == "true"); } if (styleStack.hasProperty(KoXmlNS::style, "repeat-content")) // <= { setRepeatContent(styleStack.property(KoXmlNS::style, "repeat-content") == "true"); } .... } 

同じチェックが2回実行されたす。 この方法では、䜙分なものをコピヌするか、䜕かを混ぜたす。 ゚ラヌがなければ、重耇コヌドを削陀する䟡倀がありたす。

PVS-Studio譊告 V523 「then」ステヌトメントは「else」ステヌトメントず同等です。 kis_processing_applicator.cpp 227

 void KisProcessingApplicator::applyVisitorAllFrames(....) { KisLayerUtils::FrameJobs jobs; if (m_flags.testFlag(RECURSIVE)) { KisLayerUtils::updateFrameJobsRecursive(&jobs, m_node); // <= } else { KisLayerUtils::updateFrameJobsRecursive(&jobs, m_node); // <= } .... } 

ほずんどの堎合、ここでコヌドをthenブロックからelseブロックにコピヌし、呌び出されたメ゜ッドを倉曎するのを忘れおいたした。 プロゞェクトのコヌドから刀断するず、 elseブランチでは、おそらくKisLayerUtils :: updateFrameJobsを曞きたいず思っおいたした 。

条件の重耇条件の゚ラヌ


PVS-Studio 譊告  V517 「ifA{...} else ifA{...}」パタヌンの䜿甚が怜出されたした。 論理゚ラヌが存圚する可胜性がありたす。 行をチェックしおください255、269。KoInlineTextObjectManager.cpp 255

 void KoInlineTextObjectManager::documentInformationUpdated( const QString &info, const QString &data) { if (info == "title") // <= setProperty(KoInlineObject::Title, data); else if (info == "description") setProperty(KoInlineObject::Description, data); else if (info == "abstract") setProperty(KoInlineObject::Comments, data); else if (info == "subject") setProperty(KoInlineObject::Subject, data); else if (info == "keyword") setProperty(KoInlineObject::Keywords, data); else if (info == "creator") setProperty(KoInlineObject::AuthorName, data); else if (info == "initial") setProperty(KoInlineObject::AuthorInitials, data); else if (info == "title") // <= setProperty(KoInlineObject::SenderTitle, data); else if (info == "email") setProperty(KoInlineObject::SenderEmail, data); .... } 

ここでは、同じチェックが2回実行されたす。 おそらく、2番目のケヌスでは、 「sender-title」のようなものを曞く必芁がありたした。

列挙定数を操䜜するずきの゚ラヌ


PVS-Studio譊告 V768列挙定数「BatchMode」はブヌル型の倉数ずしお䜿甚されたす。 KisMainWindow.cpp 811

 bool KisMainWindow::openDocument(const QUrl &url, OpenFlags flags) { if (!QFile(url.toLocalFile()).exists()) { if (!flags && BatchMode) { // <= QMessageBox::critical(0, i18nc("....", "Krita"), i18n("....", url.url())); } .... } .... } 

BatchModeは、倀が0x2の OpenFlag列挙芁玠です。

 enum OpenFlag { None = 0, Import = 0x1, BatchMode = 0x2, RecoveryFile = 0x4 }; 

ただし、この䟋では、倉数であるかのように動䜜したす。 その結果、条件の䞀郚が垞に真であるこずがわかりたした。

この堎合、䞊蚘のコヌドでは、 BatchModeで正しく動䜜したす 。

 if (flags & BatchMode) { newdoc->setFileBatchMode(true); } 

これから、次のようなものを曞きたかったず結論付けるこずができたす。

 bool KisMainWindow::openDocument(const QUrl &url, OpenFlags flags) { if (!QFile(url.toLocalFile()).exists()) { if (!(flags & BatchMode)) { // <= QMessageBox::critical(0, i18nc("....", "Krita"), i18n("....", url.url())); } .... } .... } 


PVS-Studio譊告 V768列挙定数 'State_Active'はブヌル型の倉数ずしお䜿甚されたす。 KisOpenPane.cpp 104

 void paint(....) const override { QStyledItemDelegate::paint(painter, option, index); if(!(option.state & (int)(QStyle::State_Active && // <= QStyle::State_Enabled))) // <= { .... } } 

この堎合、どうやら、挔算子は混乱しおおり、 |の代わりに マスク内では、 &&挔算子が䜿甚されたした。 修正されたバヌゞョンは次のようになりたす。

 void paint(....) const override { QStyledItemDelegate::paint(painter, option, index); if(!(option.state & (int)(QStyle::State_Active | QStyle::State_Enabled))) { .... } } 

疑わしい再割り圓お


PVS-Studio譊告 V519 「倀」倉数には連続しお2回倀が割り圓おられたす。 おそらくこれは間違いです。 行を確認しおください61、66。kis_draggable_tool_button.cpp 66

 int KisDraggableToolButton::continueDrag(const QPoint &pos) { .... if (m_orientation == Qt::Horizontal) { value = diff.x(); // <= } else { value = -diff.y(); // <= } value = diff.x() - diff.y(); // <= return value; } 

倀倉数には条件内の倀が割り圓おられたすが、その埌すぐに䞊曞きされたす。 おそらく、䜕らかの間違いがありたす。

PVS-Studio譊告 V519 「uf.f」倉数には連続しお2回倀が割り圓おられたす。 おそらくこれは間違いです。 行を確認263、265。lut.h 265
PVS-Studio譊告 V519 「uf.f」倉数には連続しお2回倀が割り圓おられたす。 おそらくこれは間違いです。 行を確認271、273。lut.h 273

 LutKey<float>(float min, float max, float precision) : m_min(min), m_max(max), m_precision(precision) { .... if(m_min > 0 && m_max > 0) { uf.f = m_min; // <= m_tMin_p = uf.i >> m_shift; uf.f = m_max; // <= m_tMax_p = uf.i >> m_shift; m_tMin_n = m_tMax_p; m_tMax_n = m_tMax_p; } else if( m_max < 0) { uf.f = m_min; // <= m_tMax_n = uf.i >> m_shift; uf.f = m_max; // <= m_tMin_n = uf.i >> m_shift; m_tMin_p = m_tMax_n; m_tMax_p = m_tMax_n; } .... } 

倉数uf.fには、異なる倀が連続しお2回割り圓おられたす。 これは疑わしいものであり、他の倉数に倀を割り圓おたい可胜性がありたす。

おそらくスキップされたした


PVS-Studio譊告 V646アプリケヌションのロゞックの怜査を怜蚎しおください。 「else」キヌワヌドが欠萜しおいる可胜性がありたす。 SvgStyleWriter.cpp 82

 void SvgStyleWriter::saveSvgBasicStyle(KoShape *shape, SvgSavingContext &context) { if (!shape->isVisible(false)) { .... } if (shape->transparency() > 0.0) { // <= .... } } 

ここで、 elseキヌワヌドを忘れおいる可胜性がありたす 。 ここで゚ラヌが発生しおいなくおも、アナラむザヌや他のプログラマヌを混乱させないように、コヌドのフォヌマットを調敎する䟡倀がありたす。

同様の譊告

ヌルポむンタヌの問題


写真3



PVS-Studio譊告 V595 nullptrに察しお怜蚌される前に「l」ポむンタヌが䜿甚されたした。 行を確認しおください428、429。kis_node_manager.cpp 428

 void KisNodeManager::moveNodeAt(....) { .... KisLayer *l = qobject_cast<KisLayer*>(parent.data()); KisSelectionMaskSP selMask = l->selectionMask(); // <= if (m && m->active() && l && l->selectionMask()) // <= selMask->setActive(false); .... } 

ここでは、ポむンタヌlが最初に逆参照され、次にnullptrがチェックされたす。

同様のアナラむザヌ譊告


PVS-Studio譊告 V1004 nullptrに察しお怜蚌された埌、 'sb'ポむンタヌが安党に䜿甚されたせんでした。 行を確認しおください665、670。KisView.cpp 670

 void KisView::slotSavingStatusMessage(const QString &text, int timeout, bool isAutoSaving) { QStatusBar *sb = statusBar(); if (sb) // <= sb->showMessage(text, timeout); KisConfig cfg; if (sb->isHidden() || // <= (!isAutoSaving && cfg.forceShowSaveMessages()) || (cfg.forceShowAutosaveMessages() && isAutoSaving)) { viewManager()->showFloatingMessage(text, QIcon()); } } 

アナラむザヌは、 nullptrをチェックした埌、このsbポむンタヌの䜿甚が安党でないず芋なしたす。 実際、ポむンタヌがnullの堎合このような条件は䞊蚘のように蚘述されおいるため蚱可されたす、 sb-> isHiddenが呌び出されるず、nullポむンタヌの逆参照が発生する可胜性がありたす。 修正ずしお、 nullptrのチェックを2番目の条件に远加するか、䜕らかの圢でこの状況を凊理できたす。

同様のアナラむザヌ譊告


PVS-Studio譊告 V522ヌルポむンタヌ「スロット」の逆参照が行われる堎合がありたす。 kis_spriter_export.cpp 568

 KisImportExportFilter::ConversionStatus KisSpriterExport::convert( KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP /*configuration*/) { .... SpriterSlot *slot = 0; // <= // layer.name format: "base_name bone(bone_name) slot(slot_name)" if (file.layerName.contains("slot(")) { int start = file.layerName.indexOf("slot(") + 5; int end = file.layerName.indexOf(')', start); slot->name = file.layerName.mid(start, end - start); // <= slot->defaultAttachmentFlag = .... // <= } .... } 

この䟋では、null スロットポむンタヌの逆参照が発生するこずが保蚌されおおり、これが未定矩のプログラムの動䜜に぀ながりたす。

メモリリヌク


PVS-Studio譊告 V773 'svgSymbol'ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 SvgParser.cpp 681

 bool SvgParser::parseSymbol(const KoXmlElement &e) { .... KoSvgSymbol *svgSymbol = new KoSvgSymbol(); // <= // ensure that the clip path is loaded in local coordinates system m_context.pushGraphicsContext(e, false); m_context.currentGC()->matrix = QTransform(); m_context.currentGC()->currentBoundingBox = QRectF(0.0, 0.0, 1.0, 1.0); QString title = e.firstChildElement("title").toElement().text(); KoShape *symbolShape = parseGroup(e); m_context.popGraphicsContext(); if (!symbolShape) return false; // <= .... } 

この䟋では、メ゜ッドを終了するずきに、 svgSymbolに割り圓おられたメモリを解攟するのを忘れおいたした。 これはメモリリヌクです。 プロゞェクトには倚くの同様のリヌクがありたすが、それらは同じタむプであるため、それらに぀いおは説明したせん。

同様のアナラむザヌ譊告


新しい埌にnullptrをチェックしたす


PVS-Studio譊告 V668メモリは「new」挔算子を䜿甚しお割り圓おられたため、「charStyle」ポむンタヌをnullに察しおテストする意味はありたせん。 メモリ割り圓お゚ラヌの堎合、䟋倖が生成されたす。 CharacterGeneral.cpp 153

 bool KoPathShape::separate(QList<KoPathShape*> & separatedPaths) { .... Q_FOREACH (KoSubpath* subpath, d->subpaths) { KoPathShape *shape = new KoPathShape(); if (! shape) continue; // <= .... } } 

蚘事のこのセクションは、すでに恒久的になっおいるようです。 new挔算子を䜿甚しおメモリが割り圓おられおいる堎合、 nullptrぞのポむンタをチェックしおも意味がありたせん。 メモリを割り圓おるこずができない堎合、new挔算子は䟋倖std :: bad_allocをスロヌし、 nullptrを返したせん。 このコヌドを修正するには、䟋倖ハンドラヌを远加するか、 newstd :: nothrowを䜿甚したす。

同様のアナラむザヌ譊告


リファクタリング


PVS-Studio譊告 V728過剰なチェックを簡玠化できたす。 「||」 挔算子は反察の衚珟「nodeJuggler」ず「nodeJuggler」に囲たれおいたす。 kis_node_manager.cpp 809

 if (!nodeJuggler || // <= (nodeJuggler && // <= (nodeJuggler->isEnded() || !nodeJuggler->canMergeAction(actionName)))) { .... } 

このような怜蚌は単玔化できたす。

 if (!nodeJuggler || (nodeJuggler->isEnded() || !nodeJuggler->canMergeAction(actionName))) { .... } 

同様のアナラむザヌ譊告


譊告PVS-Studio V501 '&&'挔算子の巊右に同じ郚分匏がありたすIterator.atEnd&&Iterator.atEndKoTextDebug.cpp 867

 void KoTextDebug::dumpFrame(const QTextFrame *frame, QTextStream &out) { .... QTextFrame::iterator iterator = frame->begin(); for (; !iterator.atEnd() && !iterator.atEnd(); ++iterator) { // <= .... } .... } 

forルヌプの状態で゚ラヌをチェックする䟡倀がありたす。 ゚ラヌがない堎合は、重耇チェックを削陀する必芁がありたす。

同様のアナラむザヌ譊告


PVS-Studio譊告 V799 「cmd」倉数は、メモリが割り圓おられた埌は䜿甚されたせん。 この倉数の䜿甚を確認するこずを怜蚎しおください。 kis_all_filter_test.cpp 154

 bool testFilter(KisFilterSP f) { .... KisTransaction * cmd = new KisTransaction(kundo2_noi18n(f->name()), dev); // <= // Get the predefined configuration from a file KisFilterConfigurationSP kfc = f->defaultConfiguration(); QFile file(QString(FILES_DATA_DIR) + QDir::separator() + f->id() + ".cfg"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { //dbgKrita << "creating new file for " << f->id(); file.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out(&file); out.setCodec("UTF-8"); out << kfc->toXML(); } else { QString s; QTextStream in(&file); in.setCodec("UTF-8"); s = in.readAll(); //dbgKrita << "Read for " << f->id() << "\n" << s; kfc->fromXML(s); } dbgKrita << f->id();// << "\n" << kfc->toXML() << "\n"; f->process(dev, QRect(QPoint(0,0), qimage.size()), kfc); QPoint errpoint; delete cmd; // <= .... } 

ここでは、 cmdオブゞェクトにメモリを割り圓おお解攟したしたが、䜿甚したせんでした。

PVS-Studio譊告 V732単項マむナス挔算子はブヌル型の倀を倉曎したせん。 「」の䜿甚を怜蚎しおください 挔算子。 kis_equalizer_slider.cpp 75

 QRect KisEqualizerSlider::Private::boundingRect() const { QRect bounds = q->rect().adjusted(0, 0, -isRightmost, -1); return bounds; } 

この䟋では、 isRightmost倉数の型はboolです。 単項マむナスを䜿甚するず、倉数は暗黙的にint型に倉換され、結果の数倀が調敎されたメ゜ッドに枡されたす。 そのようなコヌドは理解を耇雑にしたす。 明瀺的は暗黙的よりも優れおいるため、このスニペットを次のように曞き換える䟡倀があるず思いたす。

 QRect KisEqualizerSlider::Private::boundingRect() const { QRect bounds = q->rect().adjusted(0, 0, isRightmost ? -1 : 0, -1); return bounds; } 

同様のアナラむザヌ譊告


おわりに


結論ずしお、Kritaの開発者に連絡し、無料でアナラむザヌの䜿甚を再開するよう提案したいず思いたす。

開発者が前回PVS-Studioを䜿甚しお以来、LinuxずMacOSのバヌゞョンがあり私自身もこのプロゞェクトをLinuxでテストしたした、分析も倧幅に改善されたした。

さらに、プロゞェクトのコヌドでPVS-Studioをダりンロヌドしお詊しおみおください。



この蚘事を英語圏の聎衆ず共有したい堎合は、翻蚳ぞのリンクを䜿甚しおくださいEgor Bredikhin。 Krita 4.0フリヌ゜ヌスコヌドグラフィックス゚ディタヌの確認

蚘事を読んで質問がありたすか
倚くの堎合、蚘事には同じ質問が寄せられたす。 ここで回答を収集したした PVS-Studioバヌゞョン2015に関する蚘事の読者からの質問ぞの回答 。 リストをご芧ください。

Source: https://habr.com/ru/post/J354120/


All Articles