コード例 #1
0
    def test_multiple_multi_line_comments(self):
        """Check multi line long line comments."""
        bug_line = 31
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_3,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_3, bug_line)
        self.assertEqual(len(source_line_comments), 2)

        expected = [{
            'checkers': {'my.checker_1'},
            'message':
            'long intentional bug comment',
            'status':
            'intentional',
            'line':
            '// codechecker_intentional [ my.checker_1 ] '
            'long intentional\n // bug comment\n'
        }, {
            'checkers': {'my.checker_2'},
            'message':
            'long confirmed bug comment',
            'status':
            'confirmed',
            'line':
            '// codechecker_confirmed  [ my.checker_2 ] '
            'long confirmed\n // bug comment\n'
        }]

        self.assertDictEqual(expected[0], source_line_comments[0])
        self.assertDictEqual(expected[1], source_line_comments[1])
コード例 #2
0
    def test_cstyle_comment_multi_line_mismatch(self):
        """
        Multi line C style comment start '/*' is in a different line
        from the codechecker review status comment.

        /*
          codechecker_suppress [ my_checker_1 ]
          multi line
          comment
          again
         */
        """

        bug_line = 108
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            self.__tmp_srcfile_1, bug_line)

        for l in source_line_comments:
            print('-======')
            print(l)

        self.assertEqual(len(source_line_comments), 1)

        expected = [{
            'checkers': {'my_checker_1'},
            'message': 'multi line comment again',
            'status': 'false_positive'
        }]

        self.assertDictEqual(expected[0], source_line_comments[0])
コード例 #3
0
    def test_cstyle_comment_multi_star(self):
        """
        Multi line C style comment.

        /* codechecker_suppress [ my_checker_1 ]
         * multi line
         * comment
         * again
         */
        """

        bug_line = 98
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)

        for l in source_line_comments:
            print('-======')
            print(l)

        self.assertEqual(len(source_line_comments), 1)

        expected = [{
            'checkers': {'my_checker_1'},
            'message': 'multi line comment again',
            'status': 'false_positive'
        }]

        self.assertDictEqual(expected[0], source_line_comments[0])
コード例 #4
0
    def test_cstyle_comment_multi_line(self):
        """
        Multi line C style comment.
        /* codechecker_suppress [ my_checker_1 ]
        some longer
        comment */
        """

        bug_line = 83
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            self.__tmp_srcfile_1, bug_line)

        for line in source_line_comments:
            print(line)

        self.assertEqual(len(source_line_comments), 1)

        expected = {
            'checkers': {'my_checker_1'},
            'message':
            'some longer comment',
            'status':
            'false_positive',
            'line':
            '/* codechecker_suppress [ my_checker_1 ]\n '
            'some longer\n comment */\n'
        }

        self.assertDictEqual(expected, source_line_comments[0])
コード例 #5
0
    def test_cstyle_comment_multi_line_mismatch(self):
        """
        Multi line C style comment start '/*' is in a different line
        from the codechecker review status comment.

        /*
          codechecker_suppress [ my_checker_1 ]
          multi line
          comment
          again
         */
        """

        bug_line = 108
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            bug_line)

        for l in source_line_comments:
            print('-======')
            print(l)

        self.assertEqual(len(source_line_comments), 1)

        expected = [{
                        'checkers': {'my_checker_1'},
                        'message': 'multi line comment again',
                        'status': 'false_positive'
                    }]

        self.assertDictEqual(expected[0], source_line_comments[0])
コード例 #6
0
    def test_multiple_checker_name_comments(self):
        """
        Check multiple comment where same checker name are given for multiple
        source code comment.
        """

        bug_line = 43
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_3)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            bug_line)
        self.assertEqual(len(source_line_comments), 2)

        expected = [{
                        'checkers': {'my.checker_1'},
                        'message': 'intentional comment',
                        'status': 'intentional'
                    },
                    {
                        'checkers': {'my.checker_2', 'my.checker_1'},
                        'message': 'some comment',
                        'status': 'false_positive'
                    }]

        self.assertDictEqual(expected[0], source_line_comments[0])
        self.assertDictEqual(expected[1], source_line_comments[1])

        current_line_comments = \
            sc_handler.filter_source_line_comments(bug_line,
                                                   'my.checker_1')
        self.assertEqual(len(current_line_comments), 2)
コード例 #7
0
    def test_cstyle_comment_multi_nomsg(self):
        """
        Multi line C style comment.
        /* codechecker_suppress [ my_checker_1 ]
        */
        """

        bug_line = 89
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            bug_line)

        for l in source_line_comments:
            print(l)

        self.assertEqual(len(source_line_comments), 1)

        expected = [{
                        'checkers': {'my_checker_1'},
                        'message': 'WARNING! source code comment is missing',
                        'status': 'false_positive'
                    }]

        self.assertDictEqual(expected[0], source_line_comments[0])
コード例 #8
0
    def test_cstyle_comment(self):
        """
        C style comment in one line.
        /* codechecker_suppress [ my_checker_1 ] suppress comment */
        """

        bug_line = 76
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            bug_line)

        for l in source_line_comments:
            print(l)

        self.assertEqual(len(source_line_comments), 1)

        expected = [{
                        'checkers': {'my_checker_1'},
                        'message': 'suppress comment',
                        'status': 'false_positive'
                    }]

        self.assertDictEqual(expected[0], source_line_comments[0])
コード例 #9
0
    def test_multiple_checker_name_comments(self):
        """
        Check multiple comment where same checker name are given for multiple
        source code comment.
        """

        bug_line = 43
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_3,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            self.__tmp_srcfile_3, bug_line)
        self.assertEqual(len(source_line_comments), 2)

        expected = [{
            'checkers': {'my.checker_1'},
            'message': 'intentional comment',
            'status': 'intentional'
        }, {
            'checkers': {'my.checker_2', 'my.checker_1'},
            'message': 'some comment',
            'status': 'false_positive'
        }]

        self.assertDictEqual(expected[0], source_line_comments[0])
        self.assertDictEqual(expected[1], source_line_comments[1])

        current_line_comments = \
            sc_handler.filter_source_line_comments(self.__tmp_srcfile_3,
                                                   bug_line,
                                                   'my.checker_1')
        self.assertEqual(len(current_line_comments), 2)
コード例 #10
0
    def test_cstyle_comment_multi_nomsg(self):
        """
        Multi line C style comment.
        /* codechecker_suppress [ my_checker_1 ]
        */
        """

        bug_line = 89
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            self.__tmp_srcfile_1, bug_line)

        for l in source_line_comments:
            print(l)

        self.assertEqual(len(source_line_comments), 1)

        expected = [{
            'checkers': {'my_checker_1'},
            'message': 'WARNING! source code comment is missing',
            'status': 'false_positive'
        }]

        self.assertDictEqual(expected[0], source_line_comments[0])
コード例 #11
0
    def test_cstyle_comment(self):
        """
        C style comment in one line.
        /* codechecker_suppress [ my_checker_1 ] suppress comment */
        """

        bug_line = 76
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            self.__tmp_srcfile_1, bug_line)

        for l in source_line_comments:
            print(l)

        self.assertEqual(len(source_line_comments), 1)

        expected = [{
            'checkers': {'my_checker_1'},
            'message': 'suppress comment',
            'status': 'false_positive'
        }]

        self.assertDictEqual(expected[0], source_line_comments[0])
コード例 #12
0
    def collect_file_hashes_from_plist(plist_file):
        """
        Collects file content hashes and last modification times for the
        source files which can be found in the given plist file.

        :returns List of file paths which are in the processed plist file but
        missing from the user's disk and the source file modification times
        for the still available source files.

        """
        source_file_mod_times = {}
        missing_files = []
        sc_handler = SourceCodeCommentHandler()

        try:
            files, reports = plist_parser.parse_plist_file(plist_file)

            if not reports:
                return missing_files, source_file_mod_times

            # CppCheck generates a '0' value for the bug hash.
            # In case all of the reports in a plist file contain only
            # a hash with '0' value oeverwrite the hash values in the
            # plist report files with a context free hash value.
            rep_hash = [rep.report_hash == '0' for rep in reports]
            if all(rep_hash):
                replace_report_hash(plist_file, HashType.CONTEXT_FREE)

            for f in files:
                if not os.path.isfile(f):
                    missing_files.append(f)
                    missing_source_files.add(f)
                    continue

                content_hash = get_file_content_hash(f)
                hash_to_file[content_hash] = f
                file_to_hash[f] = content_hash
                source_file_mod_times[f] = util.get_last_mod_time(f)

            # Get file hashes which contain source code comments.
            for report in reports:
                last_report_event = report.bug_path[-1]
                file_path = files[last_report_event['location']['file']]
                if not os.path.isfile(file_path):
                    continue

                file_hash = file_to_hash[file_path]
                if file_hash in file_hash_with_review_status:
                    continue

                report_line = last_report_event['location']['line']
                if sc_handler.has_source_line_comments(file_path, report_line):
                    file_hash_with_review_status.add(file_hash)

            return missing_files, source_file_mod_times
        except Exception as ex:
            import traceback
            traceback.print_stack()
            LOG.error('Parsing the plist failed: %s', str(ex))
コード例 #13
0
    def test_cstyle_multi_comment_multi_line(self):
        """
        Multi line C style comment with multiple review status comment.

        /* codechecker_false_positive [ my.checker_2, my.checker_1 ] comment
        codechecker_intentional [ my.checker_1 ] intentional comment */

        """

        bug_line = 49
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_3)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            bug_line)

        for l in source_line_comments:
            print(l)

        self.assertEqual(len(source_line_comments), 2)

        expected = [{
                        'checkers': {'my.checker_1'},
                        'message': 'intentional comment',
                        'status': 'intentional'},
                    {
                        'checkers': {'my.checker_1', 'my.checker_2'},
                        'message': 'some comment',
                        'status': 'false_positive'
                    }]

        self.assertDictEqual(expected[0], source_line_comments[0])
        self.assertDictEqual(expected[1], source_line_comments[1])

        current_line_comments = \
            sc_handler.filter_source_line_comments(bug_line, 'my.checker_1')
        self.assertEqual(len(current_line_comments), 2)
        self.assertEqual(current_line_comments[0]['message'],
                         expected[0]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[0]['status'])
        self.assertEqual(current_line_comments[1]['message'],
                         expected[1]['message'])
        self.assertEqual(current_line_comments[1]['status'],
                         expected[1]['status'])

        current_line_comments = \
            sc_handler.filter_source_line_comments(bug_line, 'my.checker_2')
        self.assertEqual(len(current_line_comments), 1)

        self.assertEqual(current_line_comments[0]['message'],
                         expected[1]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[1]['status'])

        current_line_comments = \
            sc_handler.filter_source_line_comments(bug_line, 'my.dummy')
        self.assertEqual(len(current_line_comments), 0)
コード例 #14
0
    def test_cstyle_multi_comment_multi_line(self):
        """
        Multi line C style comment with multiple review status comment.

        /* codechecker_false_positive [ my.checker_2, my.checker_1 ] comment
        codechecker_intentional [ my.checker_1 ] intentional comment */

        """

        bug_line = 49
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_3)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)

        for l in source_line_comments:
            print(l)

        self.assertEqual(len(source_line_comments), 2)

        expected = [{
            'checkers': {'my.checker_1'},
            'message': 'intentional comment',
            'status': 'intentional'
        }, {
            'checkers': {'my.checker_1', 'my.checker_2'},
            'message': 'some comment',
            'status': 'false_positive'
        }]

        self.assertDictEqual(expected[0], source_line_comments[0])
        self.assertDictEqual(expected[1], source_line_comments[1])

        current_line_comments = \
            sc_handler.filter_source_line_comments(bug_line, 'my.checker_1')
        self.assertEqual(len(current_line_comments), 2)
        self.assertEqual(current_line_comments[0]['message'],
                         expected[0]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[0]['status'])
        self.assertEqual(current_line_comments[1]['message'],
                         expected[1]['message'])
        self.assertEqual(current_line_comments[1]['status'],
                         expected[1]['status'])

        current_line_comments = \
            sc_handler.filter_source_line_comments(bug_line, 'my.checker_2')
        self.assertEqual(len(current_line_comments), 1)

        self.assertEqual(current_line_comments[0]['message'],
                         expected[1]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[1]['status'])

        current_line_comments = \
            sc_handler.filter_source_line_comments(bug_line, 'my.dummy')
        self.assertEqual(len(current_line_comments), 0)
コード例 #15
0
    def test_no_comment(self):
        """There is no comment above the bug line."""
        bug_line = 9
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertFalse(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 0)
コード例 #16
0
    def test_no_comment(self):
        """There is no comment above the bug line."""
        bug_line = 9
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertFalse(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 0)
コード例 #17
0
    def test_multiple_all_comments(self):
        """Check multiple comment."""
        bug_line = 37
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_3,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_3, bug_line)
        self.assertEqual(len(source_line_comments), 2)

        expected = [{
            'checkers': {'my.checker_1'},
            'message': 'intentional comment',
            'status': 'intentional'
        }, {
            'checkers': {'all'},
            'message': 'some comment',
            'status': 'false_positive'
        }]

        self.assertDictEqual(expected[0], source_line_comments[0])
        self.assertDictEqual(expected[1], source_line_comments[1])

        current_line_comments = \
            sc_handler.filter_source_line_comments(self.__tmp_srcfile_3,
                                                   bug_line,
                                                   'my.checker_1')
        self.assertEqual(len(current_line_comments), 1)

        self.assertEqual(current_line_comments[0]['message'],
                         expected[0]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[0]['status'])

        current_line_comments = \
            sc_handler.filter_source_line_comments(self.__tmp_srcfile_3,
                                                   bug_line,
                                                   '')
        self.assertEqual(len(current_line_comments), 1)
        self.assertEqual(current_line_comments[0]['message'],
                         expected[1]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[1]['status'])

        current_line_comments = \
            sc_handler.filter_source_line_comments(self.__tmp_srcfile_3,
                                                   bug_line,
                                                   'my.dummy')
        self.assertEqual(len(current_line_comments), 1)

        self.assertEqual(len(current_line_comments), 1)
        self.assertEqual(current_line_comments[0]['message'],
                         expected[1]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[1]['status'])
コード例 #18
0
    def test_malformed_commment_format(self):
        """Check malformed comment."""
        bug_line = 1
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_2)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertFalse(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 0)
コード例 #19
0
    def test_multi_liner_some_checkers(self):
        """There is source code comment above the bug line."""
        bug_line = 50
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertFalse(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 0)
コード例 #20
0
    def test_src_comment_first_line(self):
        """Bug is reported for the first line."""
        bug_line = 3
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertFalse(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 0)
コード例 #21
0
    def test_multi_liner_some_checkers(self):
        """There is source code comment above the bug line."""
        bug_line = 50
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertFalse(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 0)
コード例 #22
0
    def test_malformed_commment_format(self):
        """Check malformed comment."""
        bug_line = 1
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_2)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertFalse(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 0)
コード例 #23
0
    def test_src_comment_first_line(self):
        """Bug is reported for the first line."""
        bug_line = 3
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertFalse(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 0)
コード例 #24
0
    def test_multiple_comments(self):
        """Check multiple comment."""
        bug_line = 23
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_3,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_3, bug_line)
        self.assertEqual(len(source_line_comments), 2)

        expected = [{
                        'checkers': {'my.checker_1'},
                        'message': 'intentional comment',
                        'status': 'intentional',
                        'line': '// codechecker_intentional [ my.checker_1 ] '
                                'intentional comment\n'},
                    {
                        'checkers': {'my.checker_2'},
                        'message': 'confirmed bug',
                        'status': 'confirmed',
                        'line': '// codechecker_confirmed  [ my.checker_2 ] '
                                'confirmed bug\n'
                    }]

        self.assertDictEqual(expected[0], source_line_comments[0])
        self.assertDictEqual(expected[1], source_line_comments[1])

        current_line_comments = \
            sc_handler.filter_source_line_comments(self.__tmp_srcfile_3,
                                                   bug_line,
                                                   'my.checker_1')
        self.assertEqual(len(current_line_comments), 1)
        self.assertEqual(current_line_comments[0]['message'],
                         expected[0]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[0]['status'])

        current_line_comments = \
            sc_handler.filter_source_line_comments(self.__tmp_srcfile_3,
                                                   bug_line,
                                                   'my.checker_2')
        self.assertEqual(len(current_line_comments), 1)

        self.assertEqual(current_line_comments[0]['message'],
                         expected[1]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[1]['status'])

        current_line_comments = \
            sc_handler.filter_source_line_comments(self.__tmp_srcfile_3,
                                                   bug_line,
                                                   'my.dummy')
        self.assertEqual(len(current_line_comments), 0)
コード例 #25
0
    def test_confirmed_comment(self):
        """Check Confirmed comment."""
        bug_line = 17
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_3)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {'checkers': {'all'},
                    'message': 'some comment',
                    'status': 'confirmed'}
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #26
0
    def test_fancy_comment_characters(self):
        """Check fancy comment."""
        bug_line = 64
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {'checkers': {'my_checker_1'},
                    'message': u"áúőóüöáé ▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬",
                    'status': 'false_positive'}
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #27
0
    def test_comment_characters(self):
        """Check for different special comment characters."""
        bug_line = 57
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {'checkers': {'my.checker_1', 'my.checker_2'},
                    'message': "i/';0 (*&^%$#@!)",
                    'status': 'false_positive'}
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #28
0
    def test_no_src_comment_comment(self):
        """There is no source comment above the bug line."""
        bug_line = 16
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {'checkers': {'all'},
                    'message': 'some comment',
                    'status': 'false_positive'}
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #29
0
    def test_no_fancy_comment(self):
        """Check no fancy comment."""
        bug_line = 70
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {'checkers': {'my_checker_1'},
                    'message': 'WARNING! source code comment is missing',
                    'status': 'false_positive'}
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #30
0
    def test_multi_liner_all_2(self):
        """There is source code comment above the bug line."""
        bug_line = 36
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {'checkers': {'my.checker_1', 'my.checker_2'},
                    'message': 'some really long comment',
                    'status': 'false_positive'}
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #31
0
    def test_multiple_all_comments(self):
        """Check multiple comment."""
        bug_line = 37
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_3)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 2)

        expected = [{
                        'checkers': {'my.checker_1'},
                        'message': 'intentional comment',
                        'status': 'intentional'},
                    {
                        'checkers': {'all'},
                        'message': 'some comment',
                        'status': 'false_positive'
                    }]

        self.assertDictEqual(expected[0], source_line_comments[0])
        self.assertDictEqual(expected[1], source_line_comments[1])

        current_line_comments = \
            sc_handler.filter_source_line_comments(bug_line, 'my.checker_1')
        self.assertEqual(len(current_line_comments), 1)

        self.assertEqual(current_line_comments[0]['message'],
                         expected[0]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[0]['status'])

        current_line_comments = \
            sc_handler.filter_source_line_comments(bug_line, '')
        self.assertEqual(len(current_line_comments), 1)
        self.assertEqual(current_line_comments[0]['message'],
                         expected[1]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[1]['status'])

        current_line_comments = \
            sc_handler.filter_source_line_comments(bug_line, 'my.dummy')
        self.assertEqual(len(current_line_comments), 1)

        self.assertEqual(len(current_line_comments), 1)
        self.assertEqual(current_line_comments[0]['message'],
                         expected[1]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[1]['status'])
コード例 #32
0
    def test_one_liner_all(self):
        """There is source code comment above the bug line."""
        bug_line = 29
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {
            'checkers': {'my_checker_1', 'my_checker_2'},
            'message': 'some comment',
            'status': 'false_positive'
        }
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #33
0
    def test_confirmed_comment(self):
        """Check Confirmed comment."""
        bug_line = 17
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_3)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {
            'checkers': {'all'},
            'message': 'some comment',
            'status': 'confirmed'
        }
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #34
0
    def test_no_fancy_comment(self):
        """Check no fancy comment."""
        bug_line = 70
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {
            'checkers': {'my_checker_1'},
            'message': 'WARNING! source code comment is missing',
            'status': 'false_positive'
        }
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #35
0
    def test_fancy_comment_characters(self):
        """Check fancy comment."""
        bug_line = 64
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {
            'checkers': {'my_checker_1'},
            'message': u"áúőóüöáé ▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬",
            'status': 'false_positive'
        }
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #36
0
    def test_comment_characters(self):
        """Check for different special comment characters."""
        bug_line = 57
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_1)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {
            'checkers': {'my.checker_1', 'my.checker_2'},
            'message': "i/';0 (*&^%$#@!)",
            'status': 'false_positive'
        }
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #37
0
    def collect_file_hashes_from_plist(plist_file):
        """
        Collects file content hashes and last modification times for the
        source files which can be found in the given plist file.

        :returns List of file paths which are in the processed plist file but
        missing from the user's disk and the source file modification times
        for the still available source files.

        """
        source_file_mod_times = {}
        missing_files = []
        sc_handler = SourceCodeCommentHandler()

        try:
            files, reports = plist_parser.parse_plist_file(plist_file)

            for f in files:
                if not os.path.isfile(f):
                    missing_files.append(f)
                    missing_source_files.add(f)
                    continue

                content_hash = get_file_content_hash(f)
                hash_to_file[content_hash] = f
                file_to_hash[f] = content_hash
                source_file_mod_times[f] = util.get_last_mod_time(f)

            # Get file hashes which contain source code comments.
            for report in reports:
                last_report_event = report.bug_path[-1]
                file_path = files[last_report_event['location']['file']]
                if not os.path.isfile(file_path):
                    continue

                file_hash = file_to_hash[file_path]
                if file_hash in file_hash_with_review_status:
                    continue

                report_line = last_report_event['location']['line']
                if sc_handler.has_source_line_comments(file_path, report_line):
                    file_hash_with_review_status.add(file_hash)

            return missing_files, source_file_mod_times
        except Exception as ex:
            LOG.error('Parsing the plist failed: %s', str(ex))
コード例 #38
0
    def test_no_src_comment_comment(self):
        """There is no source comment above the bug line."""
        bug_line = 16
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_1, bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {'checkers': {'all'},
                    'message': 'some comment',
                    'status': 'false_positive',
                    'line': '// codechecker_suppress [all] some comment\n'}
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #39
0
    def test_intentional_comment(self):
        """Check Intentional comment."""
        bug_line = 12
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_3,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_3, bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {
            'checkers': {'all'},
            'message': 'some comment',
            'status': 'intentional'
        }
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #40
0
    def test_false_positive_comment(self):
        """Check False positive comment."""
        bug_line = 7
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_3,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_3, bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {'checkers': {'all'},
                    'message': 'some comment',
                    'status': 'false_positive',
                    'line': '// codechecker_false_positive [ all ] '
                            'some comment\n'}
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #41
0
    def test_multi_liner_all_2(self):
        """There is source code comment above the bug line."""
        bug_line = 36
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_1, bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = {'checkers': {'my.checker_1', 'my.checker_2'},
                    'message': 'some really long comment',
                    'status': 'false_positive',
                    'line': '// codechecker_suppress [my.checker_1 '
                            'my.checker_2] some really\n // long comment\n'}
        self.assertDictEqual(expected, source_line_comments[0])
コード例 #42
0
ファイル: store.py プロジェクト: Ericsson/codechecker
    def collect_file_hashes_from_plist(plist_file):
        """
        Collects file content hashes and last modification times of files which
        can be found in the given plist file.

        :returns List of file paths which are in the processed plist file but
        missing from the user's disk.
        """
        missing_files = []
        try:
            files, reports = plist_parser.parse_plist(plist_file)

            for f in files:
                if not os.path.isfile(f):
                    missing_files.append(f)
                    missing_source_files.add(f)
                    continue

                content_hash = util.get_file_content_hash(f)
                hash_to_file[content_hash] = f
                file_to_hash[f] = content_hash
                file_to_mtime[f] = util.get_last_mod_time(f)

            # Get file hashes which contain source code comments.
            for report in reports:
                last_report_event = report.bug_path[-1]
                file_path = files[last_report_event['location']['file']]
                if not os.path.isfile(file_path):
                    continue

                file_hash = file_to_hash[file_path]
                if file_hash in file_hash_with_review_status:
                    continue

                report_line = last_report_event['location']['line']
                sc_handler = SourceCodeCommentHandler(file_path)
                if sc_handler.has_source_line_comments(report_line):
                    file_hash_with_review_status.add(file_hash)

            return missing_files
        except Exception as ex:
            LOG.error('Parsing the plist failed: %s', str(ex))
コード例 #43
0
    def test_multiple_multi_line_comments(self):
        """Check multi line long line comments."""
        bug_line = 31
        sc_handler = SourceCodeCommentHandler(self.__tmp_srcfile_3)
        res = sc_handler.has_source_line_comments(bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(bug_line)
        self.assertEqual(len(source_line_comments), 2)

        expected = [{
                        'checkers': {'my.checker_1'},
                        'message': 'long intentional bug comment',
                        'status': 'intentional'},
                    {
                        'checkers': {'my.checker_2'},
                        'message': 'long confirmed bug comment',
                        'status': 'confirmed'
                    }]

        self.assertDictEqual(expected[0], source_line_comments[0])
        self.assertDictEqual(expected[1], source_line_comments[1])
コード例 #44
0
    def test_cstyle_multi_comment_multi_line_long(self):
        """
        Multi line C style comment with multiple review status comment.

        /* codechecker_false_positive [ my.checker_2, my.checker_1 ] comment
        which
        is
        long
        codechecker_intentional [ my.checker_1 ] intentional comment
        long
        again */

        """

        bug_line = 60
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_3,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            self.__tmp_srcfile_3, bug_line)

        for line in source_line_comments:
            print(line)

        self.assertEqual(len(source_line_comments), 2)

        expected = [{
            'checkers': {'my.checker_1'},
            'message':
            'intentional comment long again',
            'status':
            'intentional',
            'line':
            'codechecker_intentional [ my.checker_1 ] '
            'intentional comment\n long\n again */\n'
        }, {
            'checkers': {'my.checker_1', 'my.checker_2'},
            'message':
            'comment which is long',
            'status':
            'false_positive',
            'line':
            '/* codechecker_false_positive [ '
            'my.checker_2, my.checker_1 ] comment\n '
            'which\n is\n long\n'
        }]

        self.assertDictEqual(expected[0], source_line_comments[0])
        self.assertDictEqual(expected[1], source_line_comments[1])

        current_line_comments = \
            sc_handler.filter_source_line_comments(self.__tmp_srcfile_3,
                                                   bug_line,
                                                   'my.checker_1')
        self.assertEqual(len(current_line_comments), 2)
        self.assertEqual(current_line_comments[0]['message'],
                         expected[0]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[0]['status'])
        self.assertEqual(current_line_comments[1]['message'],
                         expected[1]['message'])
        self.assertEqual(current_line_comments[1]['status'],
                         expected[1]['status'])

        current_line_comments = \
            sc_handler.filter_source_line_comments(self.__tmp_srcfile_3,
                                                   bug_line,
                                                   'my.checker_2')
        self.assertEqual(len(current_line_comments), 1)

        self.assertEqual(current_line_comments[0]['message'],
                         expected[1]['message'])
        self.assertEqual(current_line_comments[0]['status'],
                         expected[1]['status'])

        current_line_comments = \
            sc_handler.filter_source_line_comments(self.__tmp_srcfile_3,
                                                   bug_line,
                                                   'my.dummy')
        self.assertEqual(len(current_line_comments), 0)