diff --git a/ci/cppcheck-misra.sh b/ci/cppcheck-misra.sh index 1389882e300451d43b623d1bc6fbad31392dadd7..737eb6f217aeb121635dd5cf225b4d3121f1c7e9 100755 --- a/ci/cppcheck-misra.sh +++ b/ci/cppcheck-misra.sh @@ -12,13 +12,8 @@ cd "$(dirname "$0")/.." echo -e "\u001b[34;1mGetting prerequisites...\u001b[0m" # grab the MISRA addon and the cppcheck addon interface from github -curl https://raw.githubusercontent.com/danmar/cppcheck/f4b5b156d720c712f6ce99f6e01d8c1b3f800d52/addons/misra.py > ci/misra.py -curl https://raw.githubusercontent.com/danmar/cppcheck/f4b5b156d720c712f6ce99f6e01d8c1b3f800d52/addons/cppcheckdata.py > ci/cppcheckdata.py - -# clean up old files -echo -e "\u001b[34;1mRemoving old files...\u001b[0m" -echo > ci/report.msr # clear the report file -find inc/ src/ -type f -name "*.dump" | xargs rm +curl https://raw.githubusercontent.com/danmar/cppcheck/master/addons/misra.py > ci/misra.py +curl https://raw.githubusercontent.com/danmar/cppcheck/master/addons/cppcheckdata.py > ci/cppcheckdata.py # generate dump files (XML representations of AST etc.) for all headers, source files etc. echo -e "\u001b[34;1mGenerating dump files...\u001b[0m" @@ -30,9 +25,13 @@ find inc/ src/ -type f -name "*.dump" | xargs python3 ci/misra.py >> ci/report.m # pre-process the generated report to remove all useless strings echo -e "\u001b[34;1mPre-processing report...\u001b[0m" -sed -i -r 's/(.*Script.*)|(.*Checking.*)|(.*MISRA.*)//gm; /(^$)/d; s/(\s\(.*\)\s)//gm; s/(\]|\[)//gm; s/(misra-c2012-)//gm' ci/report.msr +sed -i -r 's/(.*Script.*)|(.*Checking.*)|(.*MISRA.*)|(.*Undefined: .*)|(.* \(-\):.*)//gm; /(^$)/d; s/(\s\(.*\)\s)//gm; s/(\]|\[)//gm; s/(misra-c2012-)/:/gm' ci/report.msr # run the summarizer for a nice, clean summary of errors echo -e "\u001b[34;1mSummarizing results...\u001b[0m" -python3 ci/summarizer.py --report ci/report.msr --suppress 3.1 5.1 5.2 5.3 12.3 14.4 15.5 16.3 18.8 +python3 ci/summarizer.py --report ci/report.msr --suppress 3.1 5.1 5.2 5.3 12.3 13.4 14.4 15.5 16.3 18.4 18.8 +# clean up old files +echo -e "\u001b[34;1mRemoving dump files...\u001b[0m" +echo > ci/report.msr # clear the report file +find inc/ src/ -type f -name "*.dump" | xargs rm -rf diff --git a/ci/cppcheck.sh b/ci/cppcheck.sh index 8252d5a24d4d604f4d7acfb8c792021dee4019b0..2179a051c88e90de9c07d7f9898422c4c38beb6f 100755 --- a/ci/cppcheck.sh +++ b/ci/cppcheck.sh @@ -12,4 +12,5 @@ echo -e "\u001b[34;1mStarting cppcheck...\u001b[0m" echo -e "\u001b[34;1mRunning cppcheck with default checklist...\u001b[0m" cd "$(dirname "$0")/.." -cppcheck --enable=all --error-exitcode=1 -I inc src test +cppcheck --enable=all --suppress=unusedFunction --suppress=noExplicitConstructor \ + --inline-suppr --error-exitcode=1 -I inc src test diff --git a/inc/Message.hpp b/inc/Message.hpp index 011f994a5d313a6200fc721e700883c41ca9b480..b03bbbdc0609800b159a23395183fe8be482c99a 100644 --- a/inc/Message.hpp +++ b/inc/Message.hpp @@ -85,7 +85,7 @@ public: // We allocate this data statically, in order to make sure there is predictability in the // handling and storage of messages // TODO: Is it a good idea to not initialise this to 0? - uint8_t data[ECSS_MAX_MESSAGE_SIZE] = {'\0'}; + uint8_t data[ECSS_MAX_MESSAGE_SIZE] = { 0 }; // private: uint8_t currentBit = 0; diff --git a/src/Message.cpp b/src/Message.cpp index a969e6ff432d6063787fc83211c5109d72688fc9..13667390dc5f652e3889c55a0c2e9a7aecd09283 100644 --- a/src/Message.cpp +++ b/src/Message.cpp @@ -134,7 +134,7 @@ void Message::readString(char* string, uint8_t size) { ASSERT_REQUEST(size < ECSS_MAX_STRING_SIZE, ErrorHandler::StringTooShort); memcpy(string, data + readPosition, size); - string[size] = '\0'; // todo: Use that for now to avoid problems. Later to be removed + string[size] = 0; // todo: Use that for now to avoid problems. Later to be removed readPosition += size; } @@ -144,7 +144,7 @@ void Message::readString(uint8_t* string, uint16_t size) { ASSERT_REQUEST(size < ECSS_MAX_STRING_SIZE, ErrorHandler::StringTooShort); memcpy(string, data + readPosition, size); - string[size] = '\0'; // todo: Use that for now to avoid problems. Later to be removed + string[size] = 0; // todo: Use that for now to avoid problems. Later to be removed readPosition += size; } diff --git a/src/Services/FunctionManagementService.cpp b/src/Services/FunctionManagementService.cpp index 88f1a338ce9ad17c63216de8dd15f4f7851f9f0c..f83354ad355c6e5a6899a06b314f8eac95d64f62 100644 --- a/src/Services/FunctionManagementService.cpp +++ b/src/Services/FunctionManagementService.cpp @@ -39,7 +39,7 @@ void FunctionManagementService::call(Message& msg) { void FunctionManagementService::include(String<FUNC_NAME_LENGTH> funcName, void (*ptr)(String<MAX_ARG_LENGTH>)) { if (not funcPtrIndex.full()) { // CAUTION: etl::map won't check by itself if it's full // before attempting to insert a key-value pair, causing segmentation faults. Check first! - funcName.append(FUNC_NAME_LENGTH - funcName.length(), '\0'); + funcName.append(FUNC_NAME_LENGTH - funcName.length(), 0); funcPtrIndex.insert(std::make_pair(funcName, ptr)); } else { ErrorHandler::reportInternalError(ErrorHandler::InternalErrorType::FunctionMapFull); diff --git a/src/main.cpp b/src/main.cpp index 6baca61c05a25e2d305499292e060500d7b1999d..b5afecc46859bb5c874be7b497a1bfd2ad58e3e6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -71,7 +71,7 @@ int main() { char pStr[4]; *pStr = 'T'; *(pStr + 1) = 'G'; - *(pStr + 2) = '\0'; + *(pStr + 2) = 0; MemoryManagementService& memMangService = Services.memoryManagement; Message rcvPack = Message(6, 5, Message::TC, 1); diff --git a/test/ErrorHandler.cpp b/test/ErrorHandler.cpp index 0e8a14b616dce2b5f5e44ebeb9f06d0d7c9d8d82..c0dc1393a8a513b024a8a2ea597feda54bcd0b71 100644 --- a/test/ErrorHandler.cpp +++ b/test/ErrorHandler.cpp @@ -17,7 +17,7 @@ TEST_CASE("Error: Failed Acceptance", "[errors]") { CHECK(report.readBits(3) == CCSDS_PACKET_VERSION); CHECK(report.readBits(1) == static_cast<uint16_t>(Message::TC)); - CHECK(report.readBits(1) == false); + CHECK(report.readBits(1) == 0); CHECK(report.readBits(11) == 47); CHECK(report.readBits(2) == ECSS_SEQUENCE_FLAGS); CHECK(report.readBits(14) == failedMessage.packetSequenceCount); @@ -39,7 +39,7 @@ TEST_CASE("Error: Failed Execution Start", "[errors]") { CHECK(report.readBits(3) == CCSDS_PACKET_VERSION); CHECK(report.readBits(1) == static_cast<uint16_t>(Message::TC)); - CHECK(report.readBits(1) == false); + CHECK(report.readBits(1) == 0); CHECK(report.readBits(11) == 56); CHECK(report.readBits(2) == ECSS_SEQUENCE_FLAGS); CHECK(report.readBits(14) == failedMessage.packetSequenceCount); @@ -61,7 +61,7 @@ TEST_CASE("Error: Failed Execution Progress", "[errors]") { CHECK(report.readBits(3) == CCSDS_PACKET_VERSION); CHECK(report.readBits(1) == static_cast<uint16_t>(Message::TC)); - CHECK(report.readBits(1) == false); + CHECK(report.readBits(1) == 0); CHECK(report.readBits(11) == 56); CHECK(report.readBits(2) == ECSS_SEQUENCE_FLAGS); CHECK(report.readBits(14) == failedMessage.packetSequenceCount); @@ -84,7 +84,7 @@ TEST_CASE("Error: Failed Execution Completion", "[errors]") { CHECK(report.readBits(3) == CCSDS_PACKET_VERSION); CHECK(report.readBits(1) == static_cast<uint16_t>(Message::TC)); - CHECK(report.readBits(1) == false); + CHECK(report.readBits(1) == 0); CHECK(report.readBits(11) == 56); CHECK(report.readBits(2) == ECSS_SEQUENCE_FLAGS); CHECK(report.readBits(14) == failedMessage.packetSequenceCount); @@ -106,7 +106,7 @@ TEST_CASE("Error: Failed Routing", "[errors]") { CHECK(report.readBits(3) == CCSDS_PACKET_VERSION); CHECK(report.readBits(1) == static_cast<uint16_t>(Message::TC)); - CHECK(report.readBits(1) == false); + CHECK(report.readBits(1) == 0); CHECK(report.readBits(11) == 71); CHECK(report.readBits(2) == ECSS_SEQUENCE_FLAGS); CHECK(report.readBits(14) == failedMessage.packetSequenceCount);