Ответ 1
Символ undefined - это функция, которая реализует проверку sanitizer. Если вы посмотрите на сгенерированный код:
Нет дезинфицирующего средства:
_Z3foof: # @_Z3foof
.cfi_startproc
# BB#0:
xorps %xmm1, %xmm1
divss %xmm1, %xmm0
ret
С дезинфицирующим средством:
_Z3foof: # @_Z3foof
.cfi_startproc
.long 1413876459 # 0x54460aeb
.quad _ZTIFffE
# BB#0:
pushq %rax
.Ltmp1:
.cfi_def_cfa_offset 16
movss %xmm0, 4(%rsp) # 4-byte Spill
movd %xmm0, %esi
movl $__unnamed_1, %edi
xorl %edx, %edx
callq __ubsan_handle_divrem_overflow
xorps %xmm1, %xmm1
movss 4(%rsp), %xmm0 # 4-byte Reload
divss %xmm1, %xmm0
popq %rax
ret
Вы видите, что он добавил код для проверки с помощью этой функции.
Компилятор должен автоматически ссылаться в соответствующей библиотеке sanitizer, а затем для меня следующая полная программа:
float foo(float f) { return (f / 0); }
int main() {
foo(1.0f);
}
Производит следующий вывод при выполнении:
main.cpp:1:32: runtime error: division by zero
Я построил и выполнил команду clang++ -fsanitize=undefined main.cpp && ./a.out
Если вам нужны проверки времени компиляции, вы хотите либо включить дополнительные предупреждения компилятора, либо статический анализатор. Тем не менее, как правило, не существует никаких предупреждений или статического анализа для ошибок с плавающей запятой.
Здесь программа, которая создает отчет анализатора:
#include <malloc.h>
int main() {
int *i = (int*) malloc(sizeof(int));
}
Скомпилированный с помощью clang++ -std=c++11 main.cpp
он не производит диагностики, но скомпилирован с clang++ -std=c++11 --analyze main.cpp
, он сообщает следующее:
main.cpp:4:10: warning: Value stored to 'i' during its initialization is never read
int *i = (int*) malloc(sizeof(int));
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:5:1: warning: Potential leak of memory pointed to by 'i'
}
^
Мертвое хранилище также может быть обнаружено с помощью "Все" [-Унимое значение], но утечка обнаруживается только анализатором.
По умолчанию результаты полного анализа записываются в файл plist. Вы также можете запустить анализатор с помощью команд:
clang++ --analyze -Xanalyzer -analyzer-output=text main.cpp
clang++ --analyze -Xanalyzer -analyzer-output=html -o html-dir main.cpp
Чтобы получить подробные проходы обнаруженных проблем на стандартном выходе или через html-отображение аннотированного исходного кода, а не в plist.
Проверки анализатора перечислены здесь.
Обратите внимание, что для лучшей работы анализатору необходимо анализировать целые программы, а это значит, что он должен привязываться к системе сборки. Обычный интерфейс - через инструмент IDE (Xcode) или scan-build
с make. У CMake есть некоторые функции clang, такие как создание clang файлов базы данных компиляции JSON, но я не уверен, если у CMake есть встроенная поддержка clang анализатор.