y2038 addon: Fix that check can never return True, add tests (#2417)
* y2038 addon: Fix that check can never return True, add tests At the beginning of `check_y2038_safe()` the variable `y2038safe` should be initialized with `True` and only be set to `False` if there are any issues. Otherwise it could never become `True`. In the unit tests the return value of `check_y2038_safe()` is now verified. But it does not yet work for the "good" example. The "good" example also returns `False` since it finds warnings in the include file. So this verification is marked with a "FIXME" comment. * y2038 tests: Add "good" test file that does not use time functionality The test file y2038-test-5-good-no-time-used.c does not use any time functionality so the y2038 addon is not allowed to issue any warnings and the check must return with `True` (code is safe).
This commit is contained in:
parent
cf7ef2e703
commit
fb96e5433a
|
@ -18,7 +18,8 @@ from .util import dump_create, dump_remove, convert_json_output
|
||||||
TEST_SOURCE_FILES = ['./addons/test/y2038/y2038-test-1-bad-time-bits.c',
|
TEST_SOURCE_FILES = ['./addons/test/y2038/y2038-test-1-bad-time-bits.c',
|
||||||
'./addons/test/y2038/y2038-test-2-no-time-bits.c',
|
'./addons/test/y2038/y2038-test-2-no-time-bits.c',
|
||||||
'./addons/test/y2038/y2038-test-3-no-use-time-bits.c',
|
'./addons/test/y2038/y2038-test-3-no-use-time-bits.c',
|
||||||
'./addons/test/y2038/y2038-test-4-good.c']
|
'./addons/test/y2038/y2038-test-4-good.c',
|
||||||
|
'./addons/test/y2038/y2038-test-5-good-no-time-used.c']
|
||||||
|
|
||||||
|
|
||||||
def setup_module(module):
|
def setup_module(module):
|
||||||
|
@ -34,7 +35,8 @@ def teardown_module(module):
|
||||||
|
|
||||||
|
|
||||||
def test_1_bad_time_bits(capsys):
|
def test_1_bad_time_bits(capsys):
|
||||||
check_y2038_safe('./addons/test/y2038/y2038-test-1-bad-time-bits.c.dump', quiet=True)
|
is_safe = check_y2038_safe('./addons/test/y2038/y2038-test-1-bad-time-bits.c.dump', quiet=True)
|
||||||
|
assert(is_safe is False)
|
||||||
captured = capsys.readouterr()
|
captured = capsys.readouterr()
|
||||||
captured = captured.out.splitlines()
|
captured = captured.out.splitlines()
|
||||||
json_output = convert_json_output(captured)
|
json_output = convert_json_output(captured)
|
||||||
|
@ -50,7 +52,8 @@ def test_1_bad_time_bits(capsys):
|
||||||
|
|
||||||
|
|
||||||
def test_2_no_time_bits(capsys):
|
def test_2_no_time_bits(capsys):
|
||||||
check_y2038_safe('./addons/test/y2038/y2038-test-2-no-time-bits.c.dump', quiet=True)
|
is_safe = check_y2038_safe('./addons/test/y2038/y2038-test-2-no-time-bits.c.dump', quiet=True)
|
||||||
|
assert(is_safe is False)
|
||||||
captured = capsys.readouterr()
|
captured = capsys.readouterr()
|
||||||
captured = captured.out.splitlines()
|
captured = captured.out.splitlines()
|
||||||
json_output = convert_json_output(captured)
|
json_output = convert_json_output(captured)
|
||||||
|
@ -66,7 +69,8 @@ def test_2_no_time_bits(capsys):
|
||||||
|
|
||||||
|
|
||||||
def test_3_no_use_time_bits(capsys):
|
def test_3_no_use_time_bits(capsys):
|
||||||
check_y2038_safe('./addons/test/y2038/y2038-test-3-no-use-time-bits.c.dump', quiet=True)
|
is_safe = check_y2038_safe('./addons/test/y2038/y2038-test-3-no-use-time-bits.c.dump', quiet=True)
|
||||||
|
assert(is_safe is False)
|
||||||
captured = capsys.readouterr()
|
captured = capsys.readouterr()
|
||||||
captured = captured.out.splitlines()
|
captured = captured.out.splitlines()
|
||||||
json_output = convert_json_output(captured)
|
json_output = convert_json_output(captured)
|
||||||
|
@ -77,7 +81,8 @@ def test_3_no_use_time_bits(capsys):
|
||||||
|
|
||||||
|
|
||||||
def test_4_good(capsys):
|
def test_4_good(capsys):
|
||||||
check_y2038_safe('./addons/test/y2038/y2038-test-4-good.c.dump', quiet=True)
|
is_safe = check_y2038_safe('./addons/test/y2038/y2038-test-4-good.c.dump', quiet=True)
|
||||||
|
# assert(is_safe is True) # FIXME: This should be a "good" example returning "True" instead of "False"
|
||||||
captured = capsys.readouterr()
|
captured = capsys.readouterr()
|
||||||
captured = captured.out.splitlines()
|
captured = captured.out.splitlines()
|
||||||
json_output = convert_json_output(captured)
|
json_output = convert_json_output(captured)
|
||||||
|
@ -88,6 +93,19 @@ def test_4_good(capsys):
|
||||||
assert(len([c for c in unsafe_calls if c['file'].endswith('.c')]) == 0)
|
assert(len([c for c in unsafe_calls if c['file'].endswith('.c')]) == 0)
|
||||||
|
|
||||||
|
|
||||||
|
def test_5_good(capsys):
|
||||||
|
is_safe = check_y2038_safe('./addons/test/y2038/y2038-test-5-good-no-time-used.c.dump', quiet=True)
|
||||||
|
assert(is_safe is True)
|
||||||
|
captured = capsys.readouterr()
|
||||||
|
captured = captured.out.splitlines()
|
||||||
|
json_output = convert_json_output(captured)
|
||||||
|
|
||||||
|
# There are no warnings from C sources.
|
||||||
|
if 'unsafe-call' in json_output:
|
||||||
|
unsafe_calls = json_output['unsafe-call']
|
||||||
|
assert(len([c for c in unsafe_calls if c['file'].endswith('.c')]) == 0)
|
||||||
|
|
||||||
|
|
||||||
def test_arguments_regression():
|
def test_arguments_regression():
|
||||||
args_ok = ["-t=foo", "--template=foo",
|
args_ok = ["-t=foo", "--template=foo",
|
||||||
"-q", "--quiet",
|
"-q", "--quiet",
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* C file that does not use any time functionality -> no errors should
|
||||||
|
* be reported.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
if (argc > 1) {
|
||||||
|
printf("Hello");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -151,8 +151,8 @@ id_Y2038 = {
|
||||||
|
|
||||||
|
|
||||||
def check_y2038_safe(dumpfile, quiet=False):
|
def check_y2038_safe(dumpfile, quiet=False):
|
||||||
# at the start of the check, we don't know if code is Y2038 safe
|
# Assume that the code is Y2038 safe until proven otherwise
|
||||||
y2038safe = False
|
y2038safe = True
|
||||||
# load XML from .dump file
|
# load XML from .dump file
|
||||||
data = cppcheckdata.parsedump(dumpfile)
|
data = cppcheckdata.parsedump(dumpfile)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue