Merge pull request #82 from PQClean/prohibit-char
Prohibit using char without explicit sign modifier
This commit is contained in:
commit
cdb0fd89f4
@ -4,6 +4,11 @@ version: 2
|
|||||||
machine: true
|
machine: true
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
|
- run:
|
||||||
|
name: Pull submodules
|
||||||
|
command: |
|
||||||
|
git submodule init
|
||||||
|
git submodule update
|
||||||
- run:
|
- run:
|
||||||
name: Install the emulation handlers
|
name: Install the emulation handlers
|
||||||
command: docker run --rm --privileged multiarch/qemu-user-static:register --reset
|
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 "
|
docker run -e CI=true --rm -v `pwd`:`pwd` -w `pwd` "pqclean/ci-container:$ARCH" /bin/bash -c "
|
||||||
uname -a &&
|
uname -a &&
|
||||||
export CC=${CC} &&
|
export CC=${CC} &&
|
||||||
|
pip3 install -r requirements.txt &&
|
||||||
cd test && python3 -m nose --rednose --verbose"
|
cd test && python3 -m nose --rednose --verbose"
|
||||||
|
|
||||||
.native_job: &nativejob
|
.native_job: &nativejob
|
||||||
@ -20,10 +26,16 @@ version: 2
|
|||||||
- image: pqclean/ci-container:$ARCH
|
- image: pqclean/ci-container:$ARCH
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
|
- run:
|
||||||
|
name: Pull submodules
|
||||||
|
command: |
|
||||||
|
git submodule init
|
||||||
|
git submodule update
|
||||||
- run:
|
- run:
|
||||||
name: Run tests
|
name: Run tests
|
||||||
command: |
|
command: |
|
||||||
export CC=${CC}
|
export CC=${CC}
|
||||||
|
pip3 install -r requirements.txt &&
|
||||||
cd test && python3 -m nose --rednose --verbose
|
cd test && python3 -m nose --rednose --verbose
|
||||||
|
|
||||||
|
|
||||||
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[submodule "test/pycparser"]
|
||||||
|
path = test/pycparser
|
||||||
|
url = https://github.com/eliben/pycparser.git
|
@ -23,6 +23,9 @@ matrix:
|
|||||||
- gcc@8
|
- gcc@8
|
||||||
before_install:
|
before_install:
|
||||||
- pip3 install -r requirements.txt
|
- 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
|
- gcc --version
|
||||||
script:
|
script:
|
||||||
- "cd test && python3 -m nose --rednose --verbose"
|
- "cd test && python3 -m nose --rednose --verbose"
|
||||||
|
@ -139,10 +139,16 @@ To do this, make sure the following is installed:
|
|||||||
* Python 3.5+
|
* Python 3.5+
|
||||||
* `nosetests` or `nose2` (either for Python 3)
|
* `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.
|
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.
|
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/
|
[circleci-pqc]: https://circleci.com/gh/PQClean/PQClean/
|
||||||
[travis-pqc]: https://travis-ci.com/PQClean/PQClean/
|
[travis-pqc]: https://travis-ci.com/PQClean/PQClean/
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
PyYAML
|
PyYAML
|
||||||
nose
|
nose
|
||||||
rednose
|
rednose
|
||||||
|
pycparser
|
||||||
|
@ -86,7 +86,6 @@ def ensure_available(executable):
|
|||||||
"""
|
"""
|
||||||
path = shutil.which(executable)
|
path = shutil.which(executable)
|
||||||
if path:
|
if path:
|
||||||
print("Found", path)
|
|
||||||
return path
|
return path
|
||||||
|
|
||||||
# Installing clang-tidy on LLVM will be too much of a mess.
|
# Installing clang-tidy on LLVM will be too much of a mess.
|
||||||
|
1
test/pycparser
Submodule
1
test/pycparser
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit e1a1d737be66308b633215fa26ac5ed30e890103
|
67
test/test_char.py
Normal file
67
test/test_char.py
Normal 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()
|
Loading…
Reference in New Issue
Block a user