Example #1
0
def test_backwards_compatibility():
    ret, stdout, stderr = cppcheck(['proj-inline-suppress/3.cpp'])
    assert '[zerodiv]' in stderr

    ret, stdout, stderr = cppcheck(
        ['--inline-suppr', 'proj-inline-suppress/3.cpp'])
    assert stderr == ''
def test_project_force_U():
    # 10018
    # -U does not work with compile_commands.json
    with tempfile.TemporaryDirectory('10018') as temp_folder:
        with open(os.path.join(temp_folder, 'bug1.cpp'), 'wt') as f:
            f.write("""
                    int x = 123 / 0;
                    #ifdef MACRO1
                    int y = 1000 / 0;
                    #endif
                    """)

        compile_commands = os.path.join(temp_folder, 'compile_commands.json')

        with open(compile_commands, 'wt') as f:
            f.write(
                '[ { "directory": "%s", "command": "c++ -o bug1.o -c bug1.cpp", "file": "bug1.cpp", "output": "bug1.o" } ]'
                % str(temp_folder))

        # Without -U => both bugs are found
        ret, stdout, stderr = cppcheck([
            '--project=' + compile_commands, '--force', '-rp=' + temp_folder,
            '--template=cppcheck1'
        ])
        assert (stderr == '[bug1.cpp:2]: (error) Division by zero.\n'
                '[bug1.cpp:4]: (error) Division by zero.\n')

        # With -U => only first bug is found
        ret, stdout, stderr = cppcheck([
            '--project=' + compile_commands, '--force', '-UMACRO1',
            '-rp=' + temp_folder, '--template=cppcheck1'
        ])
        assert stderr == '[bug1.cpp:2]: (error) Division by zero.\n'
Example #3
0
def test_file_filter():
    ret, stdout, stderr = cppcheck(['proj2/', '--file-filter=proj2/a/*'])
    file1 = os.path.join('proj2', 'a', 'a.c')
    file2 = os.path.join('proj2', 'b', 'b.c')
    assert ret == 0
    assert stdout.find('Checking %s ...' % file1) >= 0
    ret, stdout, stderr = cppcheck(['proj2/', '--file-filter=proj2/b*'])
    assert ret == 0
    assert stdout.find('Checking %s ...' % file2) >= 0
Example #4
0
def test_build_dir_dump_output():
    with tempfile.TemporaryDirectory() as tempdir:
        args = f'--cppcheck-build-dir={tempdir} --addon=misra helloworld'

        cppcheck(args.split())
        cppcheck(args.split())
        with open(f'{tempdir}/main.a1.dump', 'rt') as f:
            dump = f.read()
            assert '</dump>' in dump, 'invalid dump data: ...' + dump[-100:]
Example #5
0
def check_symbol_database(code):
    testfile = 'test.cpp'
    with open(testfile, 'w+t') as f:
        f.write(code)
    ret1, stdout1, _ = cppcheck(['--clang', '--debug', '-v', testfile])
    ret2, stdout2, _ = cppcheck(['--debug', '-v', testfile])
    os.remove(testfile)
    assert 0 == ret1, stdout1
    assert 0 == ret2, stdout2
    assert get_debug_section('### Symbol database', stdout1) == get_debug_section('### Symbol database', stdout2)
Example #6
0
def todo_check_ast(code):
    testfile = 'test.cpp'
    with open(testfile, 'w+t') as f:
        f.write(code)
    ret1, stdout1, _ = cppcheck(['--clang', '--debug', '-v', testfile])
    ret2, stdout2, _ = cppcheck(['--debug', '-v', testfile])
    os.remove(testfile)
    assert 0 == ret1, stdout1
    assert 0 == ret2, stdout2
    assert get_debug_section('##AST', stdout1) != get_debug_section('##AST', stdout2)
Example #7
0
def test_suppress_command_line():
    prjpath = getRelativeProjectPath()
    ret, stdout, stderr = cppcheck('--suppress=zerodiv:%s %s' % (os.path.join(prjpath, 'main.c'), prjpath))
    assert ret == 0
    assert stderr == ''

    prjpath = getAbsoluteProjectPath()
    ret, stdout, stderr = cppcheck('--suppress=zerodiv:%s %s' % (os.path.join(prjpath, 'main.c'), prjpath))
    assert ret == 0
    assert stderr == ''
Example #8
0
def test_build_dir():
    with tempfile.TemporaryDirectory() as tempdir:
        args = f'--cppcheck-build-dir={tempdir} --enable=all --inline-suppr proj-inline-suppress/4.c'.split(
        )

        ret, stdout, stderr = cppcheck(args)
        assert ret == 0, stdout
        assert len(stderr) == 0

        ret, stdout, stderr = cppcheck(args)
        assert ret == 0, stdout
        assert len(stderr) == 0
Example #9
0
def check_symbol_database(code):
    # Only compare symboldatabases if clang is found in PATH
    try:
        subprocess.call(['clang', '--version'])
    except OSError:
        return

    testfile = 'test.cpp'
    with open(testfile, 'w+t') as f:
        f.write(code)
    ret1, stdout1, stderr1 = cppcheck(['--clang', '--debug', '-v', testfile])
    ret2, stdout2, stderr2 = cppcheck(['--debug', '-v', testfile])
    os.remove(testfile)
    assert get_debug_section('### Symbol database', stdout1) == get_debug_section('### Symbol database', stdout2)
Example #10
0
def todo_check_ast(code):
    # Only compare syntax trees if clang is found in PATH
    try:
        subprocess.call(['clang', '--version'])
    except OSError:
        return

    testfile = 'test.cpp'
    with open(testfile, 'w+t') as f:
        f.write(code)
    ret1, stdout1, stderr1 = cppcheck(['--clang', '--debug', '-v', testfile])
    ret2, stdout2, stderr2 = cppcheck(['--debug', '-v', testfile])
    os.remove(testfile)
    assert get_debug_section('##AST', stdout1) != get_debug_section('##AST', stdout2)
Example #11
0
def test_suppress_project():
    project_file = os.path.join('helloworld', 'test.cppcheck')
    create_gui_project_file(project_file,
                            paths=['.'],
                            suppressions=[{'fileName':'main.c', 'id':'zerodiv'}])

    # Relative path
    ret, stdout, stderr = cppcheck('--project=%s' % (project_file))
    assert ret == 0
    assert stderr == ''

    # Absolute path
    ret, stdout, stderr = cppcheck('--project=%s' % (os.path.join(os.getcwd(), 'helloworld', 'test.cppcheck')))
    assert ret == 0
    assert stderr == ''
Example #12
0
def test_gui_project_loads_relative_vs_solution():
    create_gui_project_file('test.cppcheck',
                            root_path='proj2',
                            import_project='proj2/proj2.sln',
                            exclude_paths=['b'])
    ret, stdout, stderr = cppcheck(['--project=test.cppcheck'])
    assert stderr == '[a/a.c:1]: (error) Division by zero.\n'
Example #13
0
def test_gui_project_loads_absolute_vs_solution():
    create_gui_project_file('test.cppcheck',
                            root_path=os.path.join(os.getcwd(), 'proj2').replace('\\', '/'),
                            import_project=os.path.join(os.getcwd(), 'proj2', 'proj2.sln').replace('\\', '/'))
    ret, stdout, stderr = cppcheck('--project=test.cppcheck')
    assert stderr == ('[a/a.c:1]: (error) Division by zero.\n'
                      '[b/b.c:1]: (error) Division by zero.\n')
Example #14
0
def test_vs_project_relative_path():
    prjpath = getRelativeProjectPath()
    ret, stdout, stderr = cppcheck(['--template=cppcheck1', '--project=' + os.path.join(prjpath, 'helloworld.vcxproj')])
    filename = os.path.join(prjpath, 'main.c')
    assert ret == 0
    assert getVsConfigs(stdout, filename) == 'Debug|Win32 Debug|x64 Release|Win32 Release|x64'
    assert stderr == '[%s:5]: (error) Division by zero.\n' % (filename)
Example #15
0
def test_project_custom_platform(tmpdir):
    """
    import cppcheck project that contains a custom platform file
    """
    project_file = os.path.join(tmpdir, 'Project.cppcheck')

    with open(project_file, 'wt') as f:
        f.write("""
                <?xml version="1.0" encoding="UTF-8"?>
                <project version="1">
                  <platform>p1.xml</platform>
                  <paths>
                    <dir name="."/>
                  </paths>
                </project>
                """)

    with open(os.path.join(tmpdir, 'p1.xml'), 'wt') as f:
        f.write('<?xml version="1.0"?>\n<platform/>')

    with open(os.path.join(tmpdir, '1.c'), 'wt') as f:
        f.write("int x;")

    ret, stdout, stderr = cppcheck(
        ['--project=' + project_file, '--template=cppcheck1'])
    assert ret == 0, stdout
    assert stderr == ''
Example #16
0
def test_gui_project_loads_absolute_vs_solution_2():
    create_gui_project_file('test.cppcheck',
                            root_path=realpath('proj2'),
                            import_project=realpath('proj2/proj2.sln'))
    ret, stdout, stderr = cppcheck(['--project=test.cppcheck'])
    assert ret == 0, stdout
    assert stderr == ERR_A + ERR_B
Example #17
0
def test_gui_project_loads_relative_vs_solution_with_exclude():
    create_gui_project_file('test.cppcheck',
                            root_path='proj2',
                            import_project='proj2/proj2.sln',
                            exclude_paths=['b'])
    ret, stdout, stderr = cppcheck(['--project=test.cppcheck'])
    assert stderr == ERR_A
Example #18
0
def test_addon_absolute_path():
    prjpath = getAbsoluteProjectPath()
    ret, stdout, stderr = cppcheck(['--addon=misra', '--template=cppcheck1', prjpath])
    filename = os.path.join(prjpath, 'main.c')
    assert ret == 0, stdout
    assert stderr == ('[%s:5]: (error) Division by zero.\n'
                      '[%s:1]: (style) misra violation (use --rule-texts=<file> to get proper output)\n' % (filename, filename))
Example #19
0
def test_vs_project_absolute_path():
    prjpath = getAbsoluteProjectPath()
    ret, stdout, stderr = cppcheck('--project=%s' % (os.path.join(prjpath, 'helloworld.vcxproj')))
    filename = os.path.join(prjpath, 'main.c')
    assert ret == 0
    assert getVsConfigs(stdout, filename) == 'Debug|Win32 Debug|x64 Release|Win32 Release|x64'
    assert stderr == '[%s:5]: (error) Division by zero.\n' % (filename)
Example #20
0
def test_j2_suppress():
    ret, stdout, stderr = cppcheck([
        '--error-exitcode=1', '--suppress=*:proj-suppress-syntaxError/*',
        '-j2', '-q', 'proj-suppress-syntaxError'
    ])
    assert ret == 0
    assert len(stderr) == 0
Example #21
0
def test_unmatched_suppression_path_with_extra_stuf():
    ret, stdout, stderr = cppcheck([
        '--inline-suppr', '--enable=information', '--error-exitcode=1',
        './proj-inline-suppress/2.c'
    ])
    assert ret == 1
    assert 'Unmatched suppression: some_warning_id' in stderr
Example #22
0
def test_unmatched_suppression_ifdef():
    ret, stdout, stderr = cppcheck([
        '--enable=all', '--suppress=missingIncludeSystem', '--inline-suppr',
        '-DNO_ZERO_DIV', 'trac5704/trac5704a.c'
    ])
    assert ret == 0, stdout
    assert 'unmatchedSuppression' not in stderr
Example #23
0
def test_basepath_absolute_path():
    prjpath = getAbsoluteProjectPath()
    ret, stdout, stderr = cppcheck(
        ['--template=cppcheck1', prjpath, '-rp=' + prjpath])
    filename = os.path.join(prjpath, 'main.c')
    assert ret == 0
    assert stderr == '[main.c:5]: (error) Division by zero.\n'
Example #24
0
def test_suppress_unmatched_inline_suppression():  # 11172
    ret, stdout, stderr = cppcheck([
        '--enable=all', '--suppress=unmatchedSuppression', '--inline-suppr',
        'proj-inline-suppress/2.c'
    ])
    assert ret == 0, stdout
    assert 'unmatchedSuppression' not in stderr
Example #25
0
def test_basepath_relative_path():
    prjpath = getRelativeProjectPath()
    ret, stdout, stderr = cppcheck('%s -rp=%s' % (prjpath, prjpath))
    filename = os.path.join(prjpath, 'main.c')
    assert ret == 0
    assert stdout == 'Checking %s ...\n' % (filename)
    assert stderr == '[main.c:5]: (error) Division by zero.\n'
Example #26
0
def test_gui_project_loads_absolute_vs_solution():
    create_gui_project_file('test.cppcheck',
                            root_path=os.path.join(os.getcwd(), 'proj2').replace('\\', '/'),
                            import_project=os.path.join(os.getcwd(), 'proj2', 'proj2.sln').replace('\\', '/'))
    ret, stdout, stderr = cppcheck('--project=test.cppcheck')
    assert stderr == ('[a/a.c:1]: (error) Division by zero.\n'
                      '[b/b.c:1]: (error) Division by zero.\n')
Example #27
0
def test_exclude():
    prjpath = getRelativeProjectPath()
    ret, stdout, stderr = cppcheck([
        '-i' + prjpath, '--platform=win64',
        '--project=' + os.path.join(prjpath, 'helloworld.cppcheck')
    ])
    assert stdout == 'cppcheck: No C or C++ source files found.\n'
Example #28
0
def test_cppcheck_project_relative_path():
    prjpath = getRelativeProjectPath()
    ret, stdout, stderr = cppcheck(['--template=cppcheck1', '--platform=win64', '--project=' + os.path.join(prjpath, 'helloworld.cppcheck')])
    filename = os.path.join(prjpath, 'main.c')
    assert ret == 0, stdout
    assert getVsConfigs(stdout, filename) == 'Debug|x64'
    assert stderr == '[%s:5]: (error) Division by zero.\n' % filename
Example #29
0
def test_absolute_path():
    prjpath = getAbsoluteProjectPath()
    ret, stdout, stderr = cppcheck(prjpath)
    filename = os.path.join(prjpath, 'main.c')
    assert ret == 0
    assert stdout == 'Checking %s ...\n' % (filename)
    assert stderr == '[%s:5]: (error) Division by zero.\n' % (filename)
Example #30
0
def test_cppcheck_project_absolute_path():
    prjpath = getAbsoluteProjectPath()
    ret, stdout, stderr = cppcheck('--platform=win64 --project=%s' % (os.path.join(prjpath, 'helloworld.cppcheck')))
    filename = os.path.join(prjpath, 'main.c')
    assert ret == 0
    assert getVsConfigs(stdout, filename) == 'Debug|x64'
    assert stderr == '[%s:5]: (error) Division by zero.\n' % (filename)
Example #31
0
def test_addon_relative_path():
    prjpath = getRelativeProjectPath()
    ret, stdout, stderr = cppcheck('--addon=misra %s' % (prjpath))
    filename = os.path.join(prjpath, 'main.c')
    assert ret == 0
    assert stdout == 'Checking %s ...\n' % (filename)
    assert stderr == ('[%s:5]: (error) Division by zero.\n'
                      '[%s:1]: (style) misra violation (use --rule-texts=<file> to get proper output)\n' % (filename, filename))
Example #32
0
def test_gui_project_loads_compile_commands_1():
    create_compile_commands()
    ret, stdout, stderr = cppcheck('--project=proj2/proj2.cppcheck')
    cwd = os.getcwd()
    file1 = os.path.join(cwd, 'proj2', 'a', 'a.c')
    file2 = os.path.join(cwd, 'proj2', 'b', 'b.c')
    assert ret == 0
    assert stdout.find('Checking %s ...' % (file1)) >= 0
    assert stdout.find('Checking %s ...' % (file2)) >= 0
Example #33
0
def test_absolute_path():
    create_compile_commands()
    cwd = os.getcwd()
    ret, stdout, stderr = cppcheck('--project=' + os.path.join(cwd,COMPILE_COMMANDS_JSON))
    file1 = os.path.join(cwd, 'proj2', 'a', 'a.c')
    file2 = os.path.join(cwd, 'proj2', 'b', 'b.c')
    assert ret == 0
    assert stdout.find('Checking %s ...' % (file1)) >= 0
    assert stdout.find('Checking %s ...' % (file2)) >= 0
Example #34
0
def test_addon_relative_path():
    project_file = 'helloworld/test.cppcheck'
    create_gui_project_file(project_file, paths=['.'], addon='misra')
    ret, stdout, stderr = cppcheck('--project=%s' % (project_file))
    filename = os.path.join('helloworld', 'main.c')
    assert ret == 0
    assert stdout == 'Checking %s ...\n' % (filename)
    assert stderr == ('[%s:5]: (error) Division by zero.\n'
                      '[%s:1]: (style) misra violation (use --rule-texts=<file> to get proper output)\n' % (filename, filename))
Example #35
0
def test_gui_project_loads_compile_commands_2():
    create_compile_commands()
    exclude_path_1 = os.path.join(os.getcwd(), 'proj2', 'b').replace('\\', '/')
    create_gui_project_file('proj2/test.cppcheck',
                            import_project='compile_commands.json',
                            exclude_paths=[exclude_path_1])
    ret, stdout, stderr = cppcheck('--project=proj2/test.cppcheck')
    cwd = os.getcwd()
    file1 = os.path.join(cwd, 'proj2', 'a', 'a.c')
    file2 = os.path.join(cwd, 'proj2', 'b', 'b.c') # Excluded by test.cppcheck
    assert ret == 0
    assert stdout.find('Checking %s ...' % (file1)) >= 0
    assert stdout.find('Checking %s ...' % (file2)) < 0
Example #36
0
def test_gui_project_loads_relative_vs_solution():
    create_gui_project_file('test.cppcheck', import_project='proj2/proj2.sln')
    ret, stdout, stderr = cppcheck('--project=test.cppcheck')
    file1 = os.path.join('proj2', 'a', 'a.c')
    file2 = os.path.join('proj2', 'b', 'b.c')
    assert ret == 0
    assert stdout.find('Checking %s Debug|Win32...' % (file1)) >= 0
    assert stdout.find('Checking %s Debug|x64...' % (file1)) >= 0
    assert stdout.find('Checking %s Release|Win32...' % (file1)) >= 0
    assert stdout.find('Checking %s Release|x64...' % (file1)) >= 0
    assert stdout.find('Checking %s Debug|Win32...' % (file2)) >= 0
    assert stdout.find('Checking %s Debug|x64...' % (file2)) >= 0
    assert stdout.find('Checking %s Release|Win32...' % (file2)) >= 0
    assert stdout.find('Checking %s Release|x64...' % (file2)) >= 0
Example #37
0
def test_gui_project_loads_absolute_vs_solution():
    create_gui_project_file('test.cppcheck', import_project=os.path.join(os.getcwd(),'proj2', 'proj2.sln').replace('\\', '/'))
    ret, stdout, stderr = cppcheck('--project=test.cppcheck')
    file1 = os.path.join(os.getcwd(), 'proj2', 'a', 'a.c')
    file2 = os.path.join(os.getcwd(), 'proj2', 'b', 'b.c')
    print(stdout)
    assert ret == 0
    assert stdout.find('Checking %s Debug|Win32...' % (file1)) >= 0
    assert stdout.find('Checking %s Debug|x64...' % (file1)) >= 0
    assert stdout.find('Checking %s Release|Win32...' % (file1)) >= 0
    assert stdout.find('Checking %s Release|x64...' % (file1)) >= 0
    assert stdout.find('Checking %s Debug|Win32...' % (file2)) >= 0
    assert stdout.find('Checking %s Debug|x64...' % (file2)) >= 0
    assert stdout.find('Checking %s Release|Win32...' % (file2)) >= 0
    assert stdout.find('Checking %s Release|x64...' % (file2)) >= 0
Example #38
0
def test1():
    ret, stdout, stderr = cppcheck('--inline-suppr proj-inline-suppress')
    assert ret == 0
Example #39
0
def test_gui_project_loads_relative_vs_solution():
    create_gui_project_file('test.cppcheck', root_path='proj2', import_project='proj2/proj2.sln', exclude_paths=['b'])
    ret, stdout, stderr = cppcheck('--project=test.cppcheck')
    assert stderr == '[a/a.c:1]: (error) Division by zero.\n'
Example #40
0
def cppcheck_local(args):
    cwd = os.getcwd()
    os.chdir('helloworld')
    ret, stdout, stderr = cppcheck(args)
    os.chdir(cwd)
    return (ret, stdout, stderr)
Example #41
0
def test2():
    ret, stdout, stderr = cppcheck('proj-inline-suppress')
    assert ret == 0
    assert len(stderr) > 0
Example #42
0
def test_relative_path():
    ret, stdout, stderr = cppcheck('helloworld')
    filename = os.path.join('helloworld', 'main.c')
    assert ret == 0
    assert stdout == 'Checking %s ...\n' % (filename)
    assert stderr == '[%s:5]: (error) Division by zero.\n' % (filename)