
ããã¯ãPVS-Studioéçã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšããŠãªãŒãã³LibrePCBãããžã§ã¯ããããŒã ãã©ã®ããã«ãã¹ããããã«é¢ããå€å žçãªèšäºã§ãã ãã ããæ€èšŒã¯Dockerã³ã³ãããŒå ã§å®è¡ããããšããç¹ã§èå³æ·±ãèšäºã§ãã ã³ã³ããã䜿çšããå Žåããã®èšäºãã¢ãã©ã€ã¶ãéçºããã»ã¹ã«çµ±åããå¥ã®ç°¡åãªæ¹æ³ã瀺ãããšãæåŸ ããŠããŸãã
LibrePCB
LibrePCBã¯ãé»ååè·¯ãšããªã³ãåºæ¿ãèšèšããããã®ç¡æãœãããŠã§ã¢ã§ãã ããã°ã©ã ã³ãŒãã¯C ++ã§èšè¿°ãããQt5ã¯ã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ã®æ§ç¯ã«äœ¿çšãããŸãã æè¿ããã®ã¢ããªã±ãŒã·ã§ã³ã®æåã®å ¬åŒãªãªãŒã¹ãè¡ãããç¬èªã®ãã¡ã€ã«åœ¢åŒïŒ* .lpã* .lplibïŒãå®å®åãããŸããã LinuxãmacOSãããã³Windowsçšã«æºåããããã€ããªããã±ãŒãžã

LibrePCBã¯ãCããã³C ++ã§çŽ300,000è¡ã®ç©ºã§ãªãã³ãŒãã®ã¿ãå«ãå°ããªãããžã§ã¯ãã§ãã åæã«ã空ã§ãªãè¡ã®25ïŒ ã¯ã³ã¡ã³ãã§ãã ãšããã§ãããã¯ã³ã¡ã³ãã®å€§ããªå²åã§ãã ã»ãšãã©ã®å Žåãããã¯ãããžã§ã¯ãã«å€ãã®å°ããªãã¡ã€ã«ãããããã®å€§éšåããããžã§ã¯ãæ å ±ãšã©ã€ã»ã³ã¹ããã®èŠåºãã³ã¡ã³ãã§å ããããŠãããšããäºå®ã«ãããã®ã§ãã GitHubãµã€ãã³ãŒãïŒ LibrePCB
ãã®ãããžã§ã¯ãã¯ç§ãã¡ã«ãšã£ãŠèå³æ·±ãæããã®ã§ããã§ãã¯ããããšã«ããŸããã ãããããã¹ãçµæã¯ãã¯ãããã»ã©é¢çœããããŸããã§ããã ã¯ããæ¬åœã®ééãããããŸããã ããããèšäºã®èªè ã«ç¢ºãã«äŒããå¿ èŠã®ããç¹å¥ãªãã®ã¯ãããŸããã§ããã ãããããç§ãã¡ã¯èšäºãæžããããšã©ãŒããããžã§ã¯ãã®éçºè ã«éãããšã«éå®ããŸããã ãã ããèå³æ·±ãç¹ã¯ããããžã§ã¯ããDockerã€ã¡ãŒãžå ã§ãã¹ãããããããèšäºãæžã䟡å€ããããšå€æããããšã§ãã
Docker
Dockerã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¬ãã«ã®ä»®æ³åç°å¢ã§ã®ã¢ããªã±ãŒã·ã§ã³ã®å±éãšç®¡çãèªååããããã®ãœãããŠã§ã¢ã§ãã ããã«ãããã¢ããªã±ãŒã·ã§ã³ããã®ãã¹ãŠã®ç°å¢ãšäŸåé¢ä¿ãšãšãã«ã³ã³ããã«ãããã¯ãã§ããŸãã ãã®ãã¯ãããžãŒã¯5幎ã»ã©åã®ãã®ã§ãããå€ãã®äŒæ¥ããããžã§ã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ã«Dockerãå®è£ ããŠããŸãããããªãŒãã³ãœãŒã¹ã®äžçã§ã¯æè¿ãŸã§ããã¯ããŸãç®ç«ã¡ãŸããã§ããã
åœç€Ÿã¯ããªãŒãã³ãœãŒã¹ãããžã§ã¯ããšç·å¯ã«é£æºããç¬èªã®PVS-Studioéçã¢ãã©ã€ã¶ãŒã䜿çšããŠãœãŒã¹ã³ãŒãããã§ãã¯ããŸãã çŸåšã 300以äžã®ãããžã§ã¯ããæ€èšŒãããŠããŸãã ãã®ã¢ã¯ãã£ããã£ã§æãé£ããããšã¯ãåžžã«ä»ã®äººã®ãããžã§ã¯ããç·šéããããšã§ããããDockerã³ã³ããã®å°å ¥ã«ãããã®ããã»ã¹ãå€§å¹ ã«ç°¡çŽ åãããŸããã
Dockerã§ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãããã¹ãããæåã®çµéšã¯ã Azure Service Fabricã§ããã ããã§ãéçºè ã¯ãœãŒã¹ãã¡ã€ã«ãã£ã¬ã¯ããªãã³ã³ããã«ã€ã³ã¹ããŒã«ããã¢ãã©ã€ã¶ã®çµ±åã¯ã³ã³ããã§å®è¡ãããŠããã¹ã¯ãªããã®1ã€ãç·šéããããšã«å¶éãããŠããŸããã
diff --git a/src/build.sh b/src/build.sh index 290c57d..2a286dc 100755 --- a/src/build.sh +++ b/src/build.sh @@ -193,6 +193,9 @@ BuildDir() cd ${ProjBinRoot}/build.${DirName} + pvs-studio-analyzer analyze --cfg /src/PVS-Studio.cfg \ + -o ./service-fabric-pvs.log -j4 + if [ "false" = ${SkipBuild} ]; then if (( $NumProc <= 0 )); then NumProc=$(($(getconf _NPROCESSORS_ONLN)+0))
LibrePCBãããžã§ã¯ãã®éãã¯ãã€ã¡ãŒãžãšãããžã§ã¯ãããã«ãããããã®Dockerfileãããã«æäŸããããšã§ãã ããã¯ç§ãã¡ã«ãšã£ãŠããã«äŸ¿å©ã§ããããšãå€æããŸããã Dockerãã¡ã€ã«ã®äžã§èå³ã®ããéšåã次ã«ç€ºããŸãã
FROM ubuntu:14.04 # install packages RUN DEBIAN_FRONTEND=noninteractive \ apt-get -q update \ && apt-get -qy upgrade \ && apt-get -qy install git g++ qt5-default qttools5-dev-tools qt5-doc \ qtcreator libglu1-mesa-dev dia \ && apt-get clean # checkout librepcb RUN git clone --recursive https://..../LibrePCB.git /opt/LibrePCB \ && cd /opt/LibrePCB .... # build and install librepcb RUN /opt/LibrePCB/dev/docker/make_librepcb.sh ....
ã€ã¡ãŒãžã®ã¢ã»ã³ããªäžã«ãããžã§ã¯ãã®ã³ã³ãã€ã«ãšã€ã³ã¹ããŒã«ã¯è¡ããŸããã ãããã£ãŠããããžã§ã¯ãã®äœæè ããããžã§ã¯ãã®æ£åžžãªã¢ã»ã³ããªãä¿èšŒããç»åãåéããŸããã
ã³ã³ããã®èµ·ååŸãã¢ãã©ã€ã¶ãŒãã€ã³ã¹ããŒã«ããããããžã§ã¯ãããã«ãããã³åæããããã«æ¬¡ã®ã³ãã³ããå®è¡ãããŸããã
cd /opt/LibrePCB mkdir build && cd build qmake -r ../librepcb.pro pvs-studio-analyzer trace -- make -j2 pvs-studio-analyzer analyze -l /mnt/Share/PVS-Studio.lic -r /opt/LibrePCB \ -o /opt/LibrePCB/LibrePCB.log -v -j4 cp -R -L -a /opt/LibrePCB /mnt/Share
ã¡ãªã¿ã«ããã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯Windows 10ã§å®è¡ãããŸããããã¹ãŠã®äžè¬çãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®éçºè ããã®æ¹åã§éçºããŠããããšã¯éåžžã«åã°ããããšã§ãã æ®å¿µãªãããWindowsãåããã³ã³ããã¯ããã»ã©äŸ¿å©ã§ã¯ãããŸããã ç¹ã«ãœãããŠã§ã¢ãç°¡åã«ã€ã³ã¹ããŒã«ããããšã¯äžå¯èœã ããã§ãã
èŠã€ãã£ããã°
PVS-Studioéçã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšããŠçºèŠãããšã©ãŒã®èª¬æãå«ãå€å žçãªã»ã¯ã·ã§ã³ã«ãªããŸããã ã¡ãªã¿ã«ããã®æ©äŒãå©çšããŠãæè¿çµã¿èŸŒã¿ã·ã¹ãã ã®ã³ãŒãåæããµããŒãããæ¹åã§ã¢ãã©ã€ã¶ãŒãéçºããŠããããšãæãåºããããšæããŸãã èªè ã®äžéšãèªã¿é£ã°ãããããããªãèšäºãããã€ãã玹ä»ããŸãã
- PVS-Studioã«ã¯ãGNU Arm Embedded Toolchainã®ãµããŒããå«ãŸããŠããŸã ã
- PVS-StudioïŒã³ãŒãã£ã³ã°æšæºMISRA Cããã³MISRA C ++ã®ãµããŒã ã
ã¿ã€ããã¹
SymbolPreviewGraphicsItem::SymbolPreviewGraphicsItem( const IF_GraphicsLayerProvider& layerProvider, const QStringList& localeOrder, const Symbol& symbol, const Component* cmp, const tl::optional<Uuid>& symbVarUuid, const tl::optional<Uuid>& symbVarItemUuid) noexcept { if (mComponent && symbVarUuid && symbVarItemUuid) .... if (mComponent && symbVarItemUuid && symbVarItemUuid) // <= .... }
PVS-StudioèŠåïŒ V501 CWE-571ã&&ãæŒç®åã®å·ŠåŽãšå³åŽã«åãå¯æ¬¡åŒãsymbVarItemUuidãããããŸãã symbolpreviewgraphicsitem.cpp 74
å€å žçãªã¿ã€ããã¹ïŒå€æ°symbVarItemUuidã¯é£ç¶ããŠ2åãã§ãã¯ãããŸãã äžèšãšåæ§ã®ãã§ãã¯ãããããããèŠããšããã§ãã¯ãã2çªç®ã®å€æ°ãsymbVarUuidã§ããããšãæããã«ãªããŸãã
次ã®ã¿ã€ããã¹ã®ã³ãŒãã¹ããããïŒ
void Clipper::DoMaxima(TEdge *e) { .... if (e->OutIdx >= 0) { AddOutPt(e, e->Top); e->OutIdx = Unassigned; } DeleteFromAEL(e); if (eMaxPair->OutIdx >= 0) { AddOutPt(eMaxPair, e->Top); // <= eMaxPair->OutIdx = Unassigned; } DeleteFromAEL(eMaxPair); .... }
PVS-StudioèŠåïŒ V778 CWE-682 2ã€ã®åæ§ã®ã³ãŒããã©ã°ã¡ã³ããèŠã€ãããŸããã ãããããããã¯ã¿ã€ããã¹ã§ããããeãã®ä»£ããã«ãeMaxPairãå€æ°ã䜿çšããå¿ èŠããããŸãã clipper.cpp 2999
ã»ãšãã©ã®å Žåãã³ãŒãã¯Copy-Pasteã䜿çšããŠèšè¿°ãããŠããŸãã ããã¹ãã®2çªç®ã®ãããã¯ã®èŠèœãšãã®ããã e-> TopãeMaxPair-> Topã«çœ®ãæããã®ãå¿ããŠããŸããã
è¿œå ã®ãã§ãã¯
static int rndr_emphasis(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) { if (!content || !content->size) return 0; HOEDOWN_BUFPUTSL(ob, "<em>"); if (content) hoedown_buffer_put(ob, content->data, content->size); HOEDOWN_BUFPUTSL(ob, "</em>"); return 1; }
PVS-StudioèŠåïŒ V547 CWE-571åŒãã³ã³ãã³ããã¯åžžã«çã§ãã html.c 162
ããã¯ãããããŸã ãšã©ãŒã§ã¯ãªããåã«åé·ãªã³ãŒãã§ãã ã³ã³ãã³ããã€ã³ã¿ãŒãå確èªããå¿ èŠã¯ãããŸããã ãŒãã®å Žåãé¢æ°ã¯ããã«äœæ¥ãçµäºããŸãã
åæ§ã®ç¶æ³ïŒ
void Clipper::DoMaxima(TEdge *e) { .... else if( e->OutIdx >= 0 && eMaxPair->OutIdx >= 0 ) { if (e->OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e->Top); DeleteFromAEL(e); DeleteFromAEL(eMaxPair); } .... }
PVS-Studio èŠå ïŒ V547 CWE-571åŒ 'e-> OutIdx> = 0'ã¯åžžã«trueã§ãã clipper.cpp 2983
å確èªïŒe-> OutIdx> = 0ïŒã¯æå³ããããŸããã ããããããããããã¯ééãã§ãã ããšãã°ãå€æ°e-> Topããã§ãã¯ããå¿ èŠããããšä»®å®ã§ããŸãã ãã ããããã¯åãªãäºèšã§ãã ç§ãã¡ã¯ãããžã§ã¯ãã³ãŒãã«ç²ŸéããŠãããããšã©ãŒãåé·ã³ãŒããšåºå¥ã§ããŸãã:)ã
ãããŠå¥ã®ã±ãŒã¹ïŒ
QString SExpression::toString(int indent) const { .... if (child.isLineBreak() && nextChildIsLineBreak) { if (child.isLineBreak() && (i > 0) && mChildren.at(i - 1).isLineBreak()) { // too many line breaks ;) } else { str += '\n'; } } .... }
PVS-StudioèŠåïŒ V571 CWE-571ç¹°ãè¿ããã§ãã¯ã ãchild.isLineBreakïŒïŒãæ¡ä»¶ã¯ã208è¡ç®ã§æ¢ã«æ€èšŒãããŠããŸããsexpression.cpp209
è«çãšã©ãŒ
void FootprintPreviewGraphicsItem::paint(....) noexcept { .... for (const Circle& circle : mFootprint.getCircles()) { layer = mLayerProvider.getLayer(*circle.getLayerName()); if (!layer) continue; // <= if (layer) { // <= pen = QPen(....); painter->setPen(pen); } else painter->setPen(Qt::NoPen); .... } .... }
PVS-StudioèŠåïŒ V547 CWE-571åŒãã¬ã€ã€ãŒãã¯åžžã«çã§ãã ãããããªã³ãpreviewgraphicsitem.cpp 177
2çªç®ã®ifã¹ããŒãã¡ã³ãã®æ¡ä»¶ã¯åžžã«trueã§ããããã elseãã©ã³ãã¯æºããããŸããã
å¿ãããããã€ã³ã¿ãŒãã§ãã¯
extern int ZEXPORT unzGetGlobalComment ( unzFile file, char * szComment, uLong uSizeBuf) { .... if (uReadThis>0) { *szComment='\0'; if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) return UNZ_ERRNO; } if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) *(szComment+s->gi.size_comment)='\0'; .... }
PVS-StudioèŠåïŒ V595 CWE-476 nullptrã«å¯ŸããŠæ€èšŒãããåã«ã 'szComment'ãã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªããŠãã ããïŒ2068ã2073ãunzip.c 2068
uReadThis> 0ã®å Žåã szCommentãã€ã³ã¿ãŒã¯éåç §ãããŸãã ãã®ãã€ã³ã¿ãŒã¯ãã«ã§ããå¯èœæ§ããããããããã¯å±éºã§ãã ã¢ãã©ã€ã¶ã¯ããã®ãã€ã³ã¿ãããã«NULLã§ãããã©ããããã§ãã¯ããããšããäºå®ã«åºã¥ããŠããã®ãããªçµè«ãåºããŸã ã
åæåãããŠããªãã¯ã©ã¹ã¡ã³ããŒ
template <class T> class Edge { public: using VertexType = Vector2<T>; Edge(const VertexType &p1, const VertexType &p2, T w=-1) : p1(p1), p2(p2), weight(w) {}; // <= Edge(const Edge &e) : p1(e.p1), p2(e.p2), weight(e.weight), isBad(false) {}; Edge() : p1(0,0), p2(0,0), weight(0), isBad(false) {} VertexType p1; VertexType p2; T weight=0; bool isBad; };
PVS-StudioèŠåïŒ V730 CWE-457ã¯ã©ã¹ã®ãã¹ãŠã®ã¡ã³ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒå ã§åæåãããããã§ã¯ãããŸããã æ€æ»ãæ€èšããŠãã ããïŒisBadã edge.h 14
æåã®ã³ã³ã¹ãã©ã¯ã¿ãé€ããã¹ãŠã®ã³ã³ã¹ãã©ã¯ã¿ã¯ã isBadã¯ã©ã¹ã®ãã£ãŒã«ããåæåããŸãã ã»ãšãã©ã®å Žåãæåã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã誀ã£ãŠãã®åæåãå¿ããŠããŸããŸããã çµæãšããŠãæåã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯äžå®å šã«åæåããããªããžã§ã¯ããäœæããæªå®çŸ©ã®ããã°ã©ã ã®åäœãåŒãèµ·ããå¯èœæ§ããããŸãã
ããã«11 åã®V730蚺æããªã¬ãŒããããŸã ã ãã ããã³ãŒãã«ç²ŸéããŠããªãããããããã®èŠåãå®éã®åé¡ã瀺ããŠãããã©ãããå€æããã®ã¯å°é£ã§ãã ãããã®èŠåã¯ããããžã§ã¯ãã®äœè ã«ãã£ãŠæãããç ââ究ãããŠãããšæããŸãã
ã¡ã¢ãªãªãŒã¯
template <typename ElementType> void ProjectLibrary::loadElements(....) { .... ElementType* element = new ElementType(elementDir, false); // can throw if (elementList.contains(element->getUuid())) { throw RuntimeError( __FILE__, __LINE__, QString(tr("There are multiple library elements with the same " "UUID in the directory \"%1\"")) .arg(subdirPath.toNative())); } .... }
PVS-StudioèŠåïŒ V773 CWE-401ããšã¬ã¡ã³ãããã€ã³ã¿ãŒã解æŸããã«äŸå€ãã¹ããŒãããŸããã ã¡ã¢ãªãªãŒã¯ãçºçããå¯èœæ§ããããŸãã projectlibrary.cpp 245
èŠçŽ ããã§ã«ãªã¹ãã«ããå ŽåãäŸå€ãã¹ããŒãããŸãã ãã ããããã«ããã以åã«äœæããããªããžã§ã¯ãïŒ èŠçŽ å€æ°ã«æ ŒçŽãããŠãããã€ã³ã¿ãŒïŒã¯ç Žæ£ãããŸããã
ç¡å¹ãªäŸå€ã¿ã€ã
bool CmdRemoveSelectedSchematicItems::performExecute() { .... throw new LogicError(__FILE__, __LINE__); .... }
PVS-StudioèŠåïŒ V1022 CWE-755ãã€ã³ã¿ãŒã«ãã£ãŠäŸå€ãã¹ããŒãããŸããã 代ããã«å€ã§ã¹ããŒããããšãæ€èšããŠãã ããã cmdremoveselectedschematicitems.cpp 143
ã¢ãã©ã€ã¶ãŒã¯ããã€ã³ã¿ãŒã«ãã£ãŠã¹ããŒãããäŸå€ãæ€åºããŸããã ã»ãšãã©ã®å Žåãå€ã«ãã£ãŠäŸå€ãã¹ããŒããåç §ã«ãã£ãŠãã£ããããã®ãç¿æ £ã§ãã ãã€ã³ã¿ãã¹ããŒãããšãåç §ã«ãã£ãŠãã£ããããããããäŸå€ããã£ãããããªãå¯èœæ§ããããŸãã ãŸãããã€ã³ã¿ãŒã䜿çšãããšãã€ã³ã¿ãŒã»ãã¿ãŒã¯åé€æŒç®åãåŒã³åºããŠãäœæããããªããžã§ã¯ããç Žæ£ããã¡ã¢ãªãªãŒã¯ãçºçããªãããã«ããŸãã
äžè¬ã«ã æ°ããæŒç®åã¯å¶ç¶ããã«æžã蟌ãŸããåé€ããå¿ èŠããããŸãã ãããééãã§ããããšã¯ãä»ã®ãã¹ãŠã®å Žæã§æ¬¡ã®ããã«è¿°ã¹ãããŠãããšããäºå®ã«ãã£ãŠç¢ºèªãããŸãã
throw LogicError(__FILE__, __LINE__);
dynamic_castã®å±éºãªäœ¿çš
void GraphicsView::handleMouseWheelEvent( QGraphicsSceneWheelEvent* event) noexcept { if (event->modifiers().testFlag(Qt::ShiftModifier)) .... } bool GraphicsView::eventFilter(QObject* obj, QEvent* event) { .... handleMouseWheelEvent(dynamic_cast<QGraphicsSceneWheelEvent*>(event)); .... }
PVS-StudioèŠåïŒ V522 CWE-628 nullãã€ã³ã¿ãŒãã€ãã³ããã®éåç §ãè¡ãããå ŽåããããŸãã æœåšçãªãã«ãã€ã³ã¿ãŒã¯ããhandleMouseWheelEventãé¢æ°ã«æž¡ãããŸãã æåã®åŒæ°ã調ã¹ãŸãã è¡ã確èªïŒ143ã252ãgraphicsview.cpp 143
dynamic_castæŒç®åã®çµæã®ãã€ã³ã¿ãŒã¯ã handleMouseWheelEventé¢æ°ã«æž¡ãããŸãã ãã®äžã§ããã®ãã€ã³ã¿ã¯äºåã®æ€èšŒãªãã«éåç §ãããŸãã
dynamic_castæŒç®åãnullptrãè¿ãå¯èœæ§ããããããããã¯å±éºã§ãã ãã®ã³ãŒãã¯ãããé«éãªstatic_castã䜿çšãããããåªããŠããããšãããããŸãã
䜿çšããåã«ããã®ã³ãŒãã«æ瀺çãªãã€ã³ã¿ãŒãã§ãã¯ãè¿œå ããå¿ èŠããããŸãã
ãŸãããã®çš®ã®ã³ãŒãã¯éåžžã«äžè¬çã§ãïŒ
bool GraphicsView::eventFilter(QObject* obj, QEvent* event) { .... QGraphicsSceneMouseEvent* e = dynamic_cast<QGraphicsSceneMouseEvent*>(event); Q_ASSERT(e); if (e->button() == Qt::MiddleButton) .... }
PVS-StudioèŠåïŒ V522 CWE-690æœåšçãªãã«ãã€ã³ã¿ãŒãeãã®éåç §ãããå¯èœæ§ããããŸãã graphicsview.cpp 206
ãã€ã³ã¿ãŒã¯ã Q_ASSERTãã¯ãã䜿çšããŠãã§ãã¯ãããŸãã 圌ã®èª¬æã¯æ¬¡ã®ãšããã§ãã
testãfalseã®å ŽåããœãŒã¹ã³ãŒããã¡ã€ã«åãšè¡çªå·ãå«ãèŠåã¡ãã»ãŒãžãåºåããŸãã
Q_ASSERTïŒïŒã¯ãéçºäžã®äºåããã³äºåŸæ¡ä»¶ã®ãã¹ãã«åœ¹ç«ã¡ãŸãã ã³ã³ãã€ã«äžã«QT_NO_DEBUGãå®çŸ©ãããŠããå Žåã¯äœãããŸããã |
Q_ASSERTã¯ã䜿çšåã«ãã€ã³ã¿ãŒããã§ãã¯ããã®ã«æªãæ¹æ³ã§ãã ååãšããŠããªãªãŒã¹ããŒãžã§ã³ã§ã¯QT_NO_DEBUGã¯å®çŸ©ãããŠããŸããã LibrePCBãããžã§ã¯ãã®ç¶æ³ã¯ããããŸããã ãã ãããªãªãŒã¹ã§QT_NO_DEBUGãå®çŸ©ãããŠããå Žåãããã¯å¥åŠã§éæšæºçãªãœãªã¥ãŒã·ã§ã³ã§ãã
ãã¯ãããã€ãã«å±éãããå Žåãæ€èšŒããªãããšãããããŸãã ãããŠã dynamic_castã䜿çšããçç±ããŸã£ããæ確ã§ã¯ãããŸããã ãªãstatic_castã䜿çšããªãã®ã§ããïŒ
äžè¬ã«ããã®ã³ãŒãã¯ç¡èã§ããããã¹ãŠã®åæ§ã®ã³ãŒããã©ã°ã¡ã³ãã確èªãã䟡å€ããããŸãã ãããŠããšããã§ããããã®å€ãããããŸãã 82件ã®åæ§ã®ã±ãŒã¹ãæ°ããŸããïŒ
ãããã«
äžè¬çã«ãLibrePCBãããžã§ã¯ãã¯é«å質ã®ããã«æããŸããã ããã§ãããããžã§ã¯ãã®äœæè ã¯PVS-StudioããŒã«ã䜿çšããŠãã¢ãã©ã€ã¶ãŒã«ãã£ãŠç€ºãããã³ãŒãã»ã¯ã·ã§ã³ã®ã³ãŒãã¬ãã¥ãŒãç¬èªã«å®æœããããšããå§ãããŸãã ãããžã§ã¯ãã®å®å šãªåæã®ããã«ã1ãæéç¡æã®ã©ã€ã»ã³ã¹ãæäŸããæºåãã§ããŠããŸãã ããã«ããããžã§ã¯ãã³ãŒããéããŠãããGitHub Webãµã€ãã«æçš¿ãããŠãããããç¡æã®ã¢ãã©ã€ã¶ã©ã€ã»ã³ã¹ãªãã·ã§ã³ã䜿çšã§ããŸãã ãã®ã©ã€ã»ã³ã¹ãªãã·ã§ã³ã«ã€ããŠã¯è¿æ¥äžã«ãç¥ããããŸãã
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒAndrey KarpovãSvyatoslav Razmyslovã Dockerã³ã³ããå ã®PVS-Studioã§LibrePCBã確èªãã ã