Я интегрирую анализ cppcheck
с CMake, указав следующую командную строку:
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_CPPCHECK = "cppcheck;--enable=all;--suppress=missingIncludeSystem;--inline-suppr;--std=c++17;--error-exitcode=1"
и работает хорошо.
После обновления Ubuntu до версии 2.13.0 я начал видеть это дополнительное сообщение/предупреждение:
...
[89/108] Building CXX object include/boost/multi/adaptors/fftw/test/CMakeFiles/combinations.cpp.x.dir/combinations.cpp.o
Checking /home/user/boost-multi/include/boost/multi/adaptors/fftw/test/combinations.cpp ...
nofile:0:0: information: Active checkers: 4/592 (use --checkers-report=<filename> to see details) [checkersReport]
...
Для каждой цели!
Что означает это сообщение "Активные шашки: 4/592"? Почему cppcheck
?
Справка говорит:
$ cppcheck --help
...
--checkers-report=<file>
Write a report of all the active checkers to the given file.
...
Но это не помогает мне понять.
Когда я добавляю опцию 4
, я получаю следующий файл
$ cat ./.build.g++.plus/cppcheck.report
Critical errors
---------------
No critical errors, all files were checked.
Important: Analysis is still not guaranteed to be 'complete' it is possible there are false negatives.
Open source checkers
--------------------
No Check64BitPortability::pointerassignment require:portability
No CheckAssert::assertWithSideEffects require:warning
No CheckAutoVariables::assignFunctionArg require:style,warning
No CheckAutoVariables::autoVariables
No CheckAutoVariables::checkVarLifetime
No CheckBool::checkAssignBoolToFloat require:style,c++
No CheckBool::checkAssignBoolToPointer
No CheckBool::checkBitwiseOnBoolean require:style,inconclusive
No CheckBool::checkComparisonOfBoolExpressionWithInt require:warning
No CheckBool::checkComparisonOfBoolWithBool require:style,c++
No CheckBool::checkComparisonOfBoolWithInt require:warning,c++
No CheckBool::checkComparisonOfFuncReturningBool require:style,c++
No CheckBool::checkIncrementBoolean require:style
No CheckBool::pointerArithBool
No CheckBool::returnValueOfFunctionReturningBool require:style
No CheckBoost::checkBoostForeachModification
Yes CheckBufferOverrun::analyseWholeProgram
No CheckBufferOverrun::argumentSize require:warning
No CheckBufferOverrun::arrayIndex
No CheckBufferOverrun::arrayIndexThenCheck
No CheckBufferOverrun::bufferOverflow
No CheckBufferOverrun::negativeArraySize
No CheckBufferOverrun::objectIndex
No CheckBufferOverrun::pointerArithmetic require:portability
No CheckBufferOverrun::stringNotZeroTerminated require:warning,inconclusive
Yes CheckClass::analyseWholeProgram
No CheckClass::checkConst require:style,inconclusive
No CheckClass::checkConstructors require:style,warning
No CheckClass::checkCopyConstructors require:warning
No CheckClass::checkDuplInheritedMembers require:warning
No CheckClass::checkExplicitConstructors require:style
No CheckClass::checkMemset
No CheckClass::checkMissingOverride require:style,c++03
No CheckClass::checkSelfInitialization
No CheckClass::checkThisUseAfterFree require:warning
No CheckClass::checkUnsafeClassRefMember require:warning,safeChecks
No CheckClass::checkUselessOverride require:style
No CheckClass::checkVirtualFunctionCallInConstructor require:warning
No CheckClass::initializationListUsage require:performance
No CheckClass::initializerListOrder require:style,inconclusive
No CheckClass::operatorEqRetRefThis require:style
No CheckClass::operatorEqToSelf require:warning
No CheckClass::privateFunctions require:style
No CheckClass::thisSubtraction require:warning
No CheckClass::virtualDestructor
No CheckCondition::alwaysTrueFalse require:style
No CheckCondition::assignIf require:style
No CheckCondition::checkAssignmentInCondition require:style
No CheckCondition::checkBadBitmaskCheck require:style
No CheckCondition::checkCompareValueOutOfTypeRange require:style,platform
No CheckCondition::checkDuplicateConditionalAssign require:style
No CheckCondition::checkIncorrectLogicOperator require:style,warning
No CheckCondition::checkInvalidTestForOverflow require:warning
No CheckCondition::checkModuloAlwaysTrueFalse require:warning
No CheckCondition::checkPointerAdditionResultNotNull require:warning
No CheckCondition::clarifyCondition require:style
No CheckCondition::comparison require:style
No CheckCondition::duplicateCondition require:style
No CheckCondition::multiCondition require:style
No CheckCondition::multiCondition2 require:warning
No CheckExceptionSafety::checkCatchExceptionByValue require:style
No CheckExceptionSafety::checkRethrowCopy require:style
No CheckExceptionSafety::deallocThrow require:warning
No CheckExceptionSafety::destructors require:warning
No CheckExceptionSafety::nothrowThrows
No CheckExceptionSafety::rethrowNoCurrentException
No CheckExceptionSafety::unhandledExceptionSpecification require:style,inconclusive
No CheckFunctions::checkIgnoredReturnValue require:style,warning
No CheckFunctions::checkMathFunctions require:style,warning,c99,c++11
No CheckFunctions::checkMissingReturn
No CheckFunctions::checkProhibitedFunctions
No CheckFunctions::invalidFunctionUsage
No CheckFunctions::memsetInvalid2ndParam require:warning,portability
No CheckFunctions::memsetZeroBytes require:warning
No CheckFunctions::returnLocalStdMove require:performance,c++11
No CheckFunctions::useStandardLibrary require:style
No CheckIO::checkCoutCerrMisusage require:c
No CheckIO::checkFileUsage
No CheckIO::checkWrongPrintfScanfArguments
No CheckLeakAutoVar::check require:notclang
No CheckMemoryLeakInClass::check
No CheckMemoryLeakInFunction::checkReallocUsage
No CheckMemoryLeakNoVar::check
No CheckMemoryLeakStructMember::check
Yes CheckNullPointer::analyseWholeProgram
No CheckNullPointer::arithmetic
No CheckNullPointer::nullConstantDereference
No CheckNullPointer::nullPointer
No CheckOther::checkAccessOfMovedVariable require:c++11,warning
No CheckOther::checkCastIntToCharAndBack require:warning
No CheckOther::checkCharVariable require:warning,portability
No CheckOther::checkComparePointers
No CheckOther::checkComparisonFunctionIsAlwaysTrueOrFalse require:warning
No CheckOther::checkConstPointer require:style
No CheckOther::checkDuplicateBranch require:style,inconclusive
No CheckOther::checkDuplicateExpression require:style,warning
No CheckOther::checkEvaluationOrder require:C/C++03
No CheckOther::checkFuncArgNamesDifferent require:style,warning,inconclusive
No CheckOther::checkIncompleteArrayFill require:warning,portability,inconclusive
No CheckOther::checkIncompleteStatement require:warning
No CheckOther::checkInterlockedDecrement require:windows-platform
No CheckOther::checkInvalidFree
No CheckOther::checkKnownArgument require:style
No CheckOther::checkKnownPointerToBool require:style
No CheckOther::checkMisusedScopedObject require:style,c++
No CheckOther::checkModuloOfOne require:style
No CheckOther::checkNanInArithmeticExpression require:style
No CheckOther::checkNegativeBitwiseShift
No CheckOther::checkOverlappingWrite
No CheckOther::checkPassByReference require:performance,c++
No CheckOther::checkRedundantAssignment require:style
No CheckOther::checkRedundantCopy require:c++,performance,inconclusive
No CheckOther::checkRedundantPointerOp require:style
No CheckOther::checkShadowVariables require:style
No CheckOther::checkSignOfUnsignedVariable require:style
No CheckOther::checkSuspiciousCaseInSwitch require:warning,inconclusive
No CheckOther::checkSuspiciousSemicolon require:warning,inconclusive
No CheckOther::checkUnreachableCode require:style
No CheckOther::checkUnusedLabel require:style,warning
No CheckOther::checkVarFuncNullUB require:portability
No CheckOther::checkVariableScope require:style,notclang
No CheckOther::checkZeroDivision
No CheckOther::clarifyCalculation require:style
No CheckOther::clarifyStatement require:warning
No CheckOther::invalidPointerCast require:portability
No CheckOther::redundantBitwiseOperationInSwitch require:warning
No CheckOther::warningOldStylePointerCast require:style,c++
No CheckPostfixOperator::postfixOperator require:performance
No CheckSizeof::checkSizeofForArrayParameter require:warning
No CheckSizeof::checkSizeofForNumericParameter require:warning
No CheckSizeof::checkSizeofForPointerSize require:warning
No CheckSizeof::sizeofCalculation require:warning
No CheckSizeof::sizeofFunction require:warning
No CheckSizeof::sizeofVoid require:portability
No CheckSizeof::sizeofsizeof require:warning
No CheckSizeof::suspiciousSizeofCalculation require:warning,inconclusive
No CheckStl::checkDereferenceInvalidIterator require:warning
No CheckStl::checkDereferenceInvalidIterator2
No CheckStl::checkFindInsert require:performance
No CheckStl::checkMutexes require:warning
No CheckStl::erase
No CheckStl::if_find require:warning,performance
No CheckStl::invalidContainer
No CheckStl::iterators
No CheckStl::knownEmptyContainer require:style
No CheckStl::misMatchingContainerIterator
No CheckStl::misMatchingContainers
No CheckStl::missingComparison require:warning
No CheckStl::negativeIndex
No CheckStl::outOfBounds
No CheckStl::outOfBoundsIndexExpression
No CheckStl::redundantCondition require:style
No CheckStl::size require:performance,c++03
No CheckStl::stlBoundaries
No CheckStl::stlOutOfBounds
No CheckStl::string_c_str
No CheckStl::useStlAlgorithm require:style
No CheckStl::uselessCalls require:performance,warning
No CheckString::checkAlwaysTrueOrFalseStringCompare require:warning
No CheckString::checkIncorrectStringCompare require:warning
No CheckString::checkSuspiciousStringCompare require:warning
No CheckString::overlappingStrcmp require:warning
No CheckString::sprintfOverlappingData
No CheckString::strPlusChar
No CheckString::stringLiteralWrite
No CheckType::checkFloatToIntegerOverflow
No CheckType::checkIntegerOverflow require:platform
No CheckType::checkLongCast require:style
No CheckType::checkSignConversion require:warning
No CheckType::checkTooBigBitwiseShift require:platform
No CheckUninitVar::check
No CheckUninitVar::valueFlowUninit
Yes CheckUnusedFunctions::analyseWholeProgram
No CheckUnusedVar::checkFunctionVariableUsage require:style
No CheckUnusedVar::checkStructMemberUsage require:style
No CheckVaarg::va_list_usage require:notclang
No CheckVaarg::va_start_argument
Premium checkers
----------------
Not available, Cppcheck Premium is not used
Autosar
-------
Not available, Cppcheck Premium is not used
Cert C
------
Not available, Cppcheck Premium is not used
Cert C++
--------
Not available, Cppcheck Premium is not used
Misra C
-------
Misra is not enabled
Misra C++ 2008
--------------
Not available, Cppcheck Premium is not used
Кстати, cppcheck имеет открытый исходный код, поэтому любые загадки можно разгадать, посмотрев его исходный код.
@Sneftel, посмотри мою правку.
@heapunderrun, текстовые сообщения и документация могут сбивать с толку (некоторых) даже в проекте с открытым исходным кодом.
Я не эксперт по Cppcheck, но использую его регулярно.
Ваш файл отчета cppcheck.report
предполагает, что некоторые проверки не были включены с помощью флага --enable=
. Например, у вас есть множество проверок require:style или require:warning, которые вы не включили, как здесь No CheckStl::checkMutexes require:warning
.
Если посмотреть исходный код на сайте https://cppcheck.sourceforge.io/devinfo/doxyoutput/cppcheckexecutor_8cpp_source.html
онлайн, 344
можно увидеть сообщение, которое распечатывается в этой ситуации. Функция создает список включенных вами проверок и генерирует отчет.
Некоторые проблемы связаны с премиум-версией (например, средства проверки для MIRSA, Cert C и C++), поэтому я думаю, что это их способ продвигать премиум-версию cppcheck. В то же время есть такие проверки, как inconclusive
, которые, по крайней мере с моей стороны, заставляют мой компилятор C++ жаловаться на конкретные ситуации, связанные с моим кодом. На страницах руководства cppcheck также предполагается, что флаг --inconclusive может вызывать ложные срабатывания. Поэтому я считаю, что эта ошибка предназначена для того, чтобы мы знали обо всех функциях, которые мы не используем в cppcheck, и что нам, как пользователям, необходимо проверить, нужны ли нам эти функции.
Один из способов устранить ошибку — добавить checkersReport
к флагу --suppress=
, чтобы ее можно было подавить. Однако я бы посоветовал вам сохранить файл отчета, чтобы вы могли вручную просканировать его и убедиться, что все средства проверки, которые вы хотели использовать, были использованы.
Спасибо за исчерпывающий ответ. Возможно, происходит то, что --enable=all
(это флаг, который я использую) на самом деле не включает все проверки в этой версии cppcheck.
Хммм, из любопытства, какие у вас параметры компилятора в CMake? Например, включены ли у вас -Wall, -Wconversion, -Werror, -Wextra? Причина, по которой я спрашиваю об этом, заключается в том, что сгенерированный cppcheck.report
представляет собой файл отчета, который может содержать ложноотрицательные результаты, как указано в верхней части файла. На моей стороне, когда эти параметры компилятора включены, у меня есть только неубедительные предупреждения и некоторые проблемы, связанные с логическими побитовыми операциями. Однако они исчезают, когда я удаляю флаг --suppress=missingIncludeSystem
. Не могли бы вы добавить эти флаги компилятора и посмотреть, есть ли какие-либо ошибки компилятора, пожалуйста?
Думаю, я имею в виду, что флаг --enable=all
работает правильно. Но cppcheck не знает, стоит ли показывать пользователю обнаруженные проблемы, потому что они могут быть ложноотрицательными или это может быть из-за установленной вами опции, которая заставляет cppcheck анализировать код в пределах границ, которые вы его описываете. Итак, он передает его в файл журнала, чтобы мы могли просмотреть его вручную (например, cppcheck.report
).
Например, эта проблема No CheckBool::checkBitwiseOnBoolean require:style,inconclusive
является результатом добавления --suppress=missingIncludeSystem
в вашу конфигурацию. Если вы удалите эту опцию, вы получите кучу проверок information
, которые завершатся неудачей, потому что cppcheck не может найти, ох, я не знаю, pthread.h
, например.
Извиняюсь за множество комментариев.
Я активирую все возможные предупреждения, github.com/correaa/boost-multi/blob/master/test/… и запускаю cmake/cppcheck со следующими параметрами: github.com/correaa/boost-multi/blob /… . Извините, что я не понимаю вашего объяснения.
Это интересно. Если вы найдете время и захотите проверить что-нибудь, теорию. Не могли бы вы убрать флаг --suppress=missingIncludeSystem
, запустите cppcheck и посмотрите, превратилось ли большинство «Нет» в «Да».
Если я удалю --suppress=missingIncludeSystem
, то получу сотни таких ошибок information: Include file: <vector> not found. Please note: Cppcheck does not need standard library headers to get proper results. [missingIncludeSystem]
. Кроме того, в файле cppcheck.report я по-прежнему вижу почти все проверки как No
. ПРИМЕЧАНИЕ. Это касается cppcheck 2.14.2 в MacOS, а это не исходная система, в которой я обнаружил эту проблему.
Я добавил этот вывод в Cppcheck как часть сертификации безопасности. Это позволяет пользователям видеть, выполняются ли ожидаемые проверки или нет.
В вашем случае я не понимаю, почему там написано только, что было исполнено 4 шашки, что звучит очень низко. Может быть какая-то проблема.
Я не уверен, как cmake выполняет cppcheck. Но существует ли «каталог сборки cppcheck», который означает, что программы проверки не выполняются? Это было бы прекрасно.
Как будто enable-all
не работает, когда я передаю параметры команды через cmake, cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_CPPLINT = "cpplint;--quiet" -DCMAKE_CXX_CPPCHECK = "cppcheck;--enable=all;--suppress=missingIncludeSystem;--inline-suppr;--std=c++17;--check-config;--error-exitcode=1"
. Я помню, как cpp проверял много вещей, по крайней мере, в прошлом.
Странный. Я не знаю, что делает cmake, но Cppcheck должен запускать более 4 программ проверки, даже если вы не указали опцию --enable. Все программы проверки ошибок должны быть выполнены. Мне кажется, что файл по какой-то причине пропущен, и тогда я предположил, что «каталог сборки cppcheck». Критические ошибки также могут быть причиной этого, но в вашем отчете указано «Нет критических ошибок». Если вы добавите какую-то ошибку в файл, cppcheck предупредит об этом, и будет ли в отчете чекеров по-прежнему указано, что выполняются только 4 чекера? если вы добавите куда-нибудь эту строку кода, cppcheck должен предупредить: int dummy = 1000/0;
если ошибка слишком очевидна, сам компилятор может пожаловаться до cppcheck. Что я собираюсь сделать, так это прокомментировать одно из «прагм», игнорируемых cppcheck. Это все очень странно.
Что говорилось в отчете?