Merge pull request #82 from PQClean/prohibit-char

Prohibit using char without explicit sign modifier
This commit is contained in:
Joost Rijneveld 2019-04-05 13:50:38 +02:00 committed by GitHub
commit cdb0fd89f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 94 additions and 2 deletions

View File

@ -4,6 +4,11 @@ version: 2
machine: true
steps:
- checkout
- run:
name: Pull submodules
command: |
git submodule init
git submodule update
- run:
name: Install the emulation handlers
command: docker run --rm --privileged multiarch/qemu-user-static:register --reset
@ -13,6 +18,7 @@ version: 2
docker run -e CI=true --rm -v `pwd`:`pwd` -w `pwd` "pqclean/ci-container:$ARCH" /bin/bash -c "
uname -a &&
export CC=${CC} &&
pip3 install -r requirements.txt &&
cd test && python3 -m nose --rednose --verbose"
.native_job: &nativejob
@ -20,10 +26,16 @@ version: 2
- image: pqclean/ci-container:$ARCH
steps:
- checkout
- run:
name: Pull submodules
command: |
git submodule init
git submodule update
- run:
name: Run tests
command: |
export CC=${CC}
pip3 install -r requirements.txt &&
cd test && python3 -m nose --rednose --verbose

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "test/pycparser"]
path = test/pycparser
url = https://github.com/eliben/pycparser.git

View File

@ -23,6 +23,9 @@ matrix:
- gcc@8
before_install:
- pip3 install -r requirements.txt
- brew link gcc
- export PATH="/usr/local/bin:$PATH"
- ln -s /usr/local/bin/gcc-8 /usr/local/bin/gcc
- gcc --version
script:
- "cd test && python3 -m nose --rednose --verbose"

View File

@ -139,10 +139,16 @@ To do this, make sure the following is installed:
* Python 3.5+
* `nosetests` or `nose2` (either for Python 3)
You will also need to make sure the submodules are initialized by running:
```
git submodule update --init
```
Run the Python-based tests by going into the `test` directory and running `nosetests -v` or `nose2 -B -v`, depending on what you installed.
If you have the `rednose` plugin for `nosetests` installed, run `nosetests --rednose` to get colored output.
You may also run `python <testmodule>` where `<testmodule>` is any of the files starting with `test_` in the `test/` folder.
You may also run `python3 <testmodule>` where `<testmodule>` is any of the files starting with `test_` in the `test/` folder.
[circleci-pqc]: https://circleci.com/gh/PQClean/PQClean/
[travis-pqc]: https://travis-ci.com/PQClean/PQClean/

View File

@ -1,3 +1,4 @@
PyYAML
nose
rednose
pycparser

View File

@ -86,7 +86,6 @@ def ensure_available(executable):
"""
path = shutil.which(executable)
if path:
print("Found", path)
return path
# Installing clang-tidy on LLVM will be too much of a mess.

1
test/pycparser Submodule

@ -0,0 +1 @@
Subproject commit e1a1d737be66308b633215fa26ac5ed30e890103

67
test/test_char.py Normal file
View File

@ -0,0 +1,67 @@
"""
Checks that the implementation does not make use of the `char` type.
This is ambiguous; compilers can freely choose `signed` or `unsigned` char.
"""
import pqclean
import pycparser
import os
import helpers
def test_char():
for scheme in pqclean.Scheme.all_schemes():
for implementation in scheme.implementations:
yield check_char, implementation
def walk_tree(ast):
if type(ast) is pycparser.c_ast.IdentifierType:
if ast.names == ['char']:
yield ast
for (_, child) in ast.children():
yield from walk_tree(child) # recursively yield prohibited nodes
@helpers.skip_windows()
def check_char(implementation):
errors = []
for fname in os.listdir(implementation.path()):
if not fname.endswith(".c"):
continue
tdir, _ = os.path.split(os.path.realpath(__file__))
ast = pycparser.parse_file(
os.path.join(implementation.path(), fname),
use_cpp=True,
cpp_path='cc', # not all platforms link cpp correctly; cc -E works
cpp_args=[
'-E',
'-std=c99',
'-nostdinc', # pycparser cannot deal with e.g. __attribute__
'-I{}'.format(os.path.join(tdir, "../common")),
# necessary to mock e.g. <stdint.h>
'-I{}'.format(
os.path.join(tdir, 'pycparser/utils/fake_libc_include')),
]
)
for node in walk_tree(ast):
# flatten nodes to a string to easily enforce uniqueness
err = "\n at {c.file}:{c.line}:{c.column}".format(c=node.coord)
if err not in errors:
errors.append(err)
if errors:
raise AssertionError(
"Prohibited use of char without explicit signed/unsigned" +
"".join(errors)
)
if __name__ == '__main__':
try:
import nose2
nose2.main()
except ImportError:
import nose
nose.runmodule()