Módulo que verifica los argumentos intercambiados en las llamadas de funciones. Por ejemplo, la biblioteca se puede usar para detectar swaps en código como:
/* Apparent swap of 'e' and 'n' based on parameter names. */
RSA_get0_key ( rkey , & e , & n , NULL );git clone https://github.com/llvm/llvm-project.git
git checkout llvmorg-10.0.0mkdir llvm-build ; pushd llvm-build
cmake -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DLLVM_ENABLE_ASSERTIONS=1 -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_INSTALL_UTILS=1 -DLLVM_ENABLE_PROJECTS=clang -DLLVM_TOOL_CLANG_BUILD=1 -DCMAKE_INSTALL_PREFIX= $PWD /../llvm-install ../llvm-src
cmake --build . --target check-clang
cmake --build . --target install
popdpip install --user lit
export PATH= $PATH : $HOME /.local/binmkdir build ; cd build
cmake -G Ninja -DLLVM_EXTERNAL_LIT= $( which lit ) -DSWAPPED_ARGS_BUILD_CLANG_PLUGIN=ON -DCMAKE_PREFIX_PATH= $PWD /../../llvm-install/lib/cmake ~ /path/to/swap-detector
cmake --build . --target check-all Si no tiene Ninja instalado, puede usar -G "Unix Makefiles" para generar Makefiles en su lugar y construir usando make -j .
Hay una advertencia de enlazador sobre el uso de tmpnam . La infraestructura de prueba solo usa esta API para generar una base de datos de estadísticas temporales, y no se usa como parte de la API de verificador de argumentos intercambiado.
../../llvm-install/bin/scan-build -load-plugin lib/SwapDetectorPlugin.so -enable-checker gt.SwapDetector -analyzer-config gt.SwapDetector:ModelPath=sample.db clang++ ~ /dummy.cpp El directorio raíz del repositorio tiene una base de datos de muestra, llamada sample.db , que puede usarse para explorar el comportamiento de la biblioteca. Esta base de datos no está completa (solo cubre diez funciones), pero contiene información estadísticamente útil sobre las funciones que cubre.
| Opción | Descripción |
|---|---|
SWAPPED_ARGS_BUILD_CLANG_PLUGIN | Habilita la construcción del complemento Clang. Valor predeterminado: ON |
SWAPPED_ARGS_BUILD_TESTS | Habilita las pruebas de construcción. Valor predeterminado: ON |
SWAPPED_ARGS_BUILD_PYTHON | Habilita la construcción de la extensión de Python. Valor predeterminado: APAGADO |
SWAPPED_ARGS_INSTALL_PYTHON | Habilita la instalación de la extensión de Python si se ha construido. Valor predeterminado: APAGADO |
Como parte de la configuración de CMake, la última rama maestra de Googletest se descarga y se crea si la funcionalidad de prueba está habilitada.
Para ejecutar las pruebas unitarias de C ++, asegúrese de que SWAPPED_ARGS_BUILD_TESTS no esté deshabilitado al configurar el proyecto CMake. El ejecutable de TestSwappedArgsCpp se generará en una compilación exitosa y se puede ejecutar para realizar pruebas unitarias.
Para ejecutar las pruebas de complemento Clang, puede ejecutar cmake --build . --target check-all desde el directorio de compilación CMake.
Ampliamos los conceptos y algoritmos detrás del detector de swap en un trabajo de investigación, publicado en la Conferencia de Análisis y Manipulación del Código de Fuentes IEEE de 2020. Tenga en cuenta que no todos los algoritmos, heurísticas y características descritas en el trabajo de investigación están presentes en esta implementación.
Este material se basa en una investigación patrocinada por la Oficina de Operaciones de Adquisiciones del Departamento de Seguridad Nacional (DHS), División de Adquisición de S&T a través del contrato número 70RSAT19C00000056. Las opiniones y conclusiones contenidas en este documento son las de los autores y no deben interpretarse como necesariamente que representen las políticas o avales oficiales, ya sea expresados o implícitos, del Departamento de Seguridad Nacional.