3.9 Параметры, управляющие статическим анализом ¶
-fanalyzer-
Этот параметр включает статический анализ потока программы, который ищет «интересные» межпроцедурные пути через код и выдает предупреждения о найденных проблемах.
Этот анализ гораздо более затратен по времени, чем другие предупреждения GCC.
Включение этого параметра эффективно включает следующие предупреждения:
-Wanalyzer-double-fclose -Wanalyzer-double-free -Wanalyzer-exposure-through-output-file -Wanalyzer-file-leak -Wanalyzer-free-of-non-heap -Wanalyzer-malloc-leak -Wanalyzer-mismatching-deallocation -Wanalyzer-possible-null-argument -Wanalyzer-possible-null-dereference -Wanalyzer-null-argument -Wanalyzer-null-dereference -Wanalyzer-shift-count-negative -Wanalyzer-shift-count-overflow -Wanalyzer-stale-setjmp-buffer -Wanalyzer-tainted-array-index -Wanalyzer-unsafe-call-within-signal-handler -Wanalyzer-use-after-free -Wanalyzer-use-of-pointer-in-stale-stack-frame -Wanalyzer-write-to-const -Wanalyzer-write-to-string-literal
Этот параметр доступен только, если GCC был сконфигурирован с поддержкой анализатора.
-Wanalyzer-too-complex-
Если параметр -fanalyzer включен, анализатор использует различные эвристики для попытки исследовать поток управления и поток данных в программе, но эти эвристики могут быть обмануты достаточно сложным кодом.
По умолчанию анализ молчаливо останавливается, если код слишком сложен для полного исследования анализатором и достигает внутреннего лимита. Параметр -Wanalyzer-too-complex выдает предупреждение, если это произойдёт.
-Wno-analyzer-double-fclose-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-double-fclose для его отключения.
Эта диагностика предупреждает о путях через код, в которых
FILE *может иметьfcloseвызванным более одного раза. -Wno-analyzer-double-free-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-double-free для его отключения.
Эта диагностика предупреждает о путях через код, в которых указатель может иметь деаллокатор, вызываемый более одного раза, либо
free, либо деаллокатор, на который ссылается атрибутmalloc. -Wno-analyzer-exposure-through-output-file-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-exposure-through-output-file для его отключения.
Эта диагностика предупреждает о путях через код, в которых значение, чувствительное к безопасности, записывается в выходной файл (например, запись пароля в лог-файл).
-Wno-analyzer-file-leak-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-file-leak для его отключения.
Эта диагностика предупреждает о путях через код, в которых
<stdio.h>FILE *объект потока утечка. -Wno-analyzer-free-of-non-heap-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-free-of-non-heap для его отключения.
Эта диагностика предупреждает о путях через код, в которых
freeвызывается на указателе, не являющемся кучей (например, стековом буфере или глобальной переменной). -Wno-analyzer-malloc-leak-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-malloc-leak для его отключения.
Эта диагностика предупреждает о путях через код, в которых указатель, выделенный с помощью выделения памяти, утечка: либо
malloc, либо функция, помеченная атрибутомmalloc. -Wno-analyzer-mismatching-deallocation-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-mismatching-deallocation для его отключения.
Эта диагностика предупреждает о путях через код, в которых используется неверная функция деаллокации для указателя, основываясь на функции, использовавшейся для выделения указателя. Диагностика выведет предупреждение о несоответствиях между
free, скалярнымиdeleteи векторнымиdelete[], и теми, которые помечены как пары выделения/освобождения с помощью атрибутаmalloc. -Wno-analyzer-possible-null-argument-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-possible-null-argument для его отключения.
Эта диагностика предупреждает о путях через код, в которых возможно нулевое значение передаётся в аргумент функции, помеченный
__attribute__((nonnull))как требующий ненулевое значение. -Wno-analyzer-possible-null-dereference-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-possible-null-dereference для его отключения.
Эта диагностика предупреждает о путях через код, в которых обращается к возможно нулевому значению.
-Wno-analyzer-null-argument-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-null-argument для его отключения.
Эта диагностика предупреждает о путях через код, в которых известное нулевое значение передаётся в аргумент функции, помеченный
__attribute__((nonnull))как требующий ненулевое значение. -Wno-analyzer-null-dereference-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-null-dereference для его отключения.
Эта диагностика предупреждает о путях через код, в которых обращается к известному нулевому значению.
-Wno-analyzer-shift-count-negative-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-shift-count-negative для его отключения.
Эта диагностика предупреждает о путях через код, в которых выполняется сдвиг с отрицательным счётом. Она аналогична диагностике -Wshift-count-negative, реализованной в C/C++ фронтендах, но реализована на основе анализа межпроцедурных путей, а не просто синтаксического анализа дерева. Однако анализатор не делает упор на обнаружение таких путей, поэтому ложные негативы более вероятны по сравнению с другими предупреждениями.
-Wno-analyzer-shift-count-overflow-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-shift-count-overflow для его отключения.
Эта диагностика предупреждает о путях через код, в которых выполняется сдвиг со счётом, равным или большим точности типа операнда. Она аналогична диагностике -Wshift-count-overflow, реализованной в C/C++ фронтендах, но реализована на основе анализа межпроцедурных путей, а не просто синтаксического анализа дерева. Однако анализатор не делает упор на обнаружение таких путей, поэтому ложные негативы более вероятны по сравнению с другими предупреждениями.
-Wno-analyzer-stale-setjmp-buffer-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-stale-setjmp-buffer для его отключения.
Эта диагностика предупреждает о путях через код, в которых
longjmpвызывается для перемотки кjmp_buf, связанному с вызовомsetjmpв функции, которая уже вернулась.Когда
setjmpвызывается наjmp_bufдля записи позиции перемотки, она записывает кадр стека. Кадр стека становится недействительным, когда функция, содержащая вызовsetjmp, возвращается. Попытка перемотки к нему с помощьюlongjmpпривела бы к обращению к кадру стека, который больше не существует, и, вероятно, к аварии (или худшему). -Wno-analyzer-tainted-array-index-
Для включения этого предупреждения необходимы как -fanalyzer, так и -fanalyzer-checker=taint; используйте -Wno-analyzer-tainted-array-index для его отключения.
Эта диагностика предупреждает о путях через код, в которых значение, которое может быть под контролем злоумышленника, используется в качестве индекса доступа к массиву без очистки.
-Wno-analyzer-unsafe-call-within-signal-handler-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-unsafe-call-within-signal-handler для его отключения.
Эта диагностика предупреждает о путях через код, в которых функция, известная как небезопасная для обработки сигналов (например,
fprintf), вызывается из обработчика сигнала. -Wno-analyzer-use-after-free-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-use-after-free для его отключения.
Эта диагностика предупреждает о путях через код, в которых указатель используется после вызова деаллокации на нём: либо
free, либо деаллокатор, на который ссылается атрибутmalloc. -Wno-analyzer-use-of-pointer-in-stale-stack-frame-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-use-of-pointer-in-stale-stack-frame для его отключения.
Эта диагностика предупреждает о путях через код, в которых указатель обращается к переменной в устаревшем кадре стека.
-Wno-analyzer-write-to-const-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-write-to-const для его отключения.
Эта диагностика предупреждает о путях через код, в которых анализатор обнаруживает попытку записи через указатель на объект
const. Однако анализатор не делает упор на обнаружение таких путей, поэтому ложные негативы более вероятны по сравнению с другими предупреждениями. -Wno-analyzer-write-to-string-literal-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-write-to-string-literal для его отключения.
Эта диагностика предупреждает о путях через код, в которых анализатор обнаруживает попытку записи через указатель на строковый литерал. Однако анализатор не делает упор на обнаружение таких путей, поэтому ложные негативы более вероятны по сравнению с другими предупреждениями.
Соответствующие параметры для управления исследованием: --param analyzer-bb-explosion-factor=значение, --param analyzer-max-enodes-per-program-point=значение, --param analyzer-max-recursion-depth=значение и --param analyzer-min-snodes-for-call-summary=значение.
Следующие параметры управляют анализатором.
-fanalyzer-call-summaries-
Упростить межинтерпретационний анализ, вычислив эффект определённых вызовов, а не исследуя все пути через функцию от места вызова до каждого возможного возвращения.
Если включено, сводки вызовов используются только для функций с более чем одним местом вызова и достаточно сложных (согласно --param analyzer-min-snodes-for-call-summary=значение).
-fanalyzer-checker=name-
Ограничить анализатор запуском только указанного чеккера и включить его.
Некоторые чекеры по умолчанию отключены (даже с -fanalyzer), например, чеккер
taint, который реализует -Wanalyzer-tainted-array-index, и для их включения требуется этот параметр. -fno-analyzer-feasibility-
Этот параметр предназначен для разработчиков анализатора.
По умолчанию анализатор проверяет, что для каждого диагностического сообщения существует выполнимый путь управления: что условия, которые выполняются, не взаимоисключающие. Диагностические сообщения, для которых не найден выполнимый путь, отклоняются. Этот фильтр можно отключить с помощью -fno-analyzer-feasibility для отладки проблем в этом коде.
-fanalyzer-fine-grained-
Этот параметр предназначен для разработчиков анализатора.
Внутренне анализатор строит «взрывообразный граф», который объединяет графы потока управления с информацией о потоке данных.
По умолчанию ребро в этом графе может содержать эффекты выполнения нескольких операторов в блоке базового кода. С -fanalyzer-fine-grained каждый оператор получает своё собственное ребро.
-fanalyzer-show-duplicate-count-
Этот параметр предназначен для разработчиков анализатора: если несколько диагностических сообщений были обнаружены как дубли друг друга, при сообщении о лучшей диагностике выводится заметка, указывающая количество дополнительных диагностических сообщений, подавленных логикой дедупликации.
-fno-analyzer-state-merge-
Этот параметр предназначен для разработчиков анализатора.
По умолчанию анализатор пытается упростить анализ, объединяя достаточно похожие состояния в каждой точке программы при построении своего «взрывообразного графа». С -fno-analyzer-state-merge это слияние можно отключить для отладки проблем с обработкой состояний.
-fno-analyzer-state-purge-
Этот параметр предназначен для разработчиков анализатора.
По умолчанию анализатор пытается упростить анализ, удаляя аспекты состояния в точке программы, которые, похоже, больше не актуальны, например, значения локальных переменных, к которым не обращаются позже в функции и которые не имеют отношения к анализу утечек.
С -fno-analyzer-state-purge это удаление состояния можно отключить для отладки проблем с обработкой состояния.
-fanalyzer-transitivity-
Этот параметр включает транзитивность ограничений в анализаторе.
-fanalyzer-verbose-edges-
Этот параметр предназначен для разработчиков анализатора. Он включает более подробные, более низкоуровневые детали в описаниях потока управления в диагностических путях.
-fanalyzer-verbose-state-changes-
Этот параметр предназначен для разработчиков анализатора. Он включает более подробные, более низкоуровневые детали в описаниях событий, относящихся к автоматам состояний в диагностических путях.
-fanalyzer-verbosity=level-
Этот параметр управляет сложностью путей потока управления, которые выводятся для диагностических сообщений анализатора.
Значение уровень может быть одним из:
- ‘0’
-
На этом уровне отображаются межинтерпретационные события вызова и возврата, а также наиболее важные события изменения состояния, относящиеся к диагностическому сообщению. Например, для диагностического сообщения с двойным
free, оба вызоваfreeбудут показаны. - ‘1’
-
Как и на предыдущем уровне, но также показывать события входа в каждую функцию.
- ‘2’
-
Как и на предыдущем уровне, но также отображать события, относящиеся к потоку управления, которые важны для запуска проблемы (например, «используемый путь» в условном операторе).
Этот уровень является значением по умолчанию.
- ‘3’
-
Как и на предыдущем уровне, но отображать все события потока управления, а не только важные.
- ‘4’
-
Этот уровень предназначен для разработчиков анализатора; он добавляет различные другие события, предназначенные для отладки анализатора.
-fdump-analyzer-
Вывести внутренние детали о том, что делает анализатор, в файл.analyzer.txt. Этот параметр переопределяется параметром -fdump-analyzer-stderr.
-fdump-analyzer-stderr-
Вывести внутренние детали о том, что делает анализатор, в stderr. Этот параметр переопределяет -fdump-analyzer.
-fdump-analyzer-callgraph-
Вывести представление графа вызовов, пригодное для просмотра с помощью GraphViz, в файл.callgraph.dot.
-fdump-analyzer-exploded-graph-
Вывести представление «взрывообразного графа», пригодное для просмотра с помощью GraphViz, в файл.eg.dot. Узлы имеют цветовую кодировку, основанную на состояниях автомата состояний, чтобы подчеркнуть изменения состояния.
-fdump-analyzer-exploded-nodes-
Вывести диагностические сообщения, показывающие, где узлы в «взрывообразном графе» находятся по отношению к исходному коду программы.
-fdump-analyzer-exploded-nodes-2-
Вывести текстовое представление «взрывообразного графа» в файл.eg.txt.
-fdump-analyzer-exploded-nodes-3-
Вывести текстовое представление «взрывообразного графа» в отдельный файл на узел, в файл.eg-id.txt. Обычно это большое количество файлов.
-fdump-analyzer-feasibility-
Вывести внутренние детали поиска анализатором выполнимых путей. Детали выводятся в формате, пригодном для просмотра с помощью GraphViz, в файлы с именами в формате файл.*.fg.dot и файл.*.tg.dot.
-fdump-analyzer-json-
Вывести сжатое представление JSON внутренней информации анализатора в файл.analyzer.json.gz. Точный формат может меняться.
-fdump-analyzer-state-purge-
Как и в -fdump-analyzer-supergraph, вывести представление «суперграфа», пригодное для просмотра с помощью GraphViz, но добавить в граф информацию о том, какое состояние будет удалено в каждом узле. Граф записывается в файл.state-purge.dot.
-fdump-analyzer-supergraph-
Вывести представления «суперграфа», пригодные для просмотра с помощью GraphViz, в файл.supergraph.dot и файл.supergraph-eg.dot. Они показывают все графы потока управления в программе с межинтерпретационными рёбрами для вызовов и возвратов. Второй вывод содержит аннотации, показывающие узлы в «взрывообразном графе» и связанные с ними диагностические сообщения.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/Static-Analyzer-Options.html