| 907 | } |
| 908 | |
| 909 | bool cmCTestMemCheckHandler::ProcessMemCheckValgrindOutput( |
| 910 | std::string const& str, std::string& log, std::vector<int>& results) |
| 911 | { |
| 912 | std::vector<std::string> lines; |
| 913 | cmsys::SystemTools::Split(str, lines); |
| 914 | bool unlimitedOutput = false; |
| 915 | if (str.find("CTEST_FULL_OUTPUT") != std::string::npos || |
| 916 | this->TestOptions.OutputSizeFailed == 0) { |
| 917 | unlimitedOutput = true; |
| 918 | } |
| 919 | |
| 920 | std::string::size_type cc; |
| 921 | |
| 922 | std::ostringstream ostr; |
| 923 | log.clear(); |
| 924 | |
| 925 | int defects = 0; |
| 926 | |
| 927 | cmsys::RegularExpression valgrindLine("^==[0-9][0-9]*=="); |
| 928 | |
| 929 | cmsys::RegularExpression vgFIM( |
| 930 | R"(== .*Invalid free\(\) / delete / delete\[\])"); |
| 931 | cmsys::RegularExpression vgFMM( |
| 932 | R"(== .*Mismatched free\(\) / delete / delete \[\])"); |
| 933 | cmsys::RegularExpression vgMLK1( |
| 934 | "== .*[0-9,]+ bytes in [0-9,]+ blocks are definitely lost" |
| 935 | " in loss record [0-9,]+ of [0-9,]+"); |
| 936 | cmsys::RegularExpression vgMLK2( |
| 937 | "== .*[0-9,]+ \\([0-9,]+ direct, [0-9,]+ indirect\\)" |
| 938 | " bytes in [0-9,]+ blocks are definitely lost" |
| 939 | " in loss record [0-9,]+ of [0-9,]+"); |
| 940 | cmsys::RegularExpression vgPAR( |
| 941 | "== .*Syscall param .* (contains|points to) unaddressable byte\\(s\\)"); |
| 942 | cmsys::RegularExpression vgMPK1( |
| 943 | "== .*[0-9,]+ bytes in [0-9,]+ blocks are possibly lost in" |
| 944 | " loss record [0-9,]+ of [0-9,]+"); |
| 945 | cmsys::RegularExpression vgMPK2( |
| 946 | "== .*[0-9,]+ bytes in [0-9,]+ blocks are still reachable" |
| 947 | " in loss record [0-9,]+ of [0-9,]+"); |
| 948 | cmsys::RegularExpression vgUMC( |
| 949 | "== .*Conditional jump or move depends on uninitiali[sz]ed value\\(s\\)"); |
| 950 | cmsys::RegularExpression vgUMR1( |
| 951 | "== .*Use of uninitiali[sz]ed value of size [0-9,]+"); |
| 952 | cmsys::RegularExpression vgUMR2("== .*Invalid read of size [0-9,]+"); |
| 953 | cmsys::RegularExpression vgUMR3("== .*Jump to the invalid address "); |
| 954 | cmsys::RegularExpression vgUMR4( |
| 955 | "== .*Syscall param .* contains " |
| 956 | "uninitiali[sz]ed or unaddressable byte\\(s\\)"); |
| 957 | cmsys::RegularExpression vgUMR5("== .*Syscall param .* uninitiali[sz]ed"); |
| 958 | cmsys::RegularExpression vgIPW("== .*Invalid write of size [0-9,]+"); |
| 959 | cmsys::RegularExpression vgABR("== .*pthread_mutex_unlock: mutex is " |
| 960 | "locked by a different thread"); |
| 961 | std::vector<std::string::size_type> nonValGrindOutput; |
| 962 | auto sttime = std::chrono::steady_clock::now(); |
| 963 | cmCTestOptionalLog(this->CTest, DEBUG, |
| 964 | "Start test: " << lines.size() << std::endl, this->Quiet); |
| 965 | std::string::size_type totalOutputSize = 0; |
| 966 | for (cc = 0; cc < lines.size(); cc++) { |