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-possible-null-argument -Wanalyzer-possible-null-dereference -Wanalyzer-null-argument -Wanalyzer-null-dereference -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
Этот параметр доступен только в том случае, если 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вызванное на нём более одного раза. -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, теряется. -Wno-analyzer-possible-null-argument-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-possible-null-argument для его отключения.
Эта диагностика предупреждает о путях в коде, в которых возможное значение NULL передается аргументу функции, помеченному
__attribute__((nonnull))как требующему ненулевого значения. -Wno-analyzer-possible-null-dereference-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-possible-null-dereference для его отключения.
Эта диагностика предупреждает о путях в коде, в которых возможное значение NULL разыменовывается.
-Wno-analyzer-null-argument-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-null-argument для его отключения.
Эта диагностика предупреждает о путях в коде, в которых известное значение NULL передается аргументу функции, помеченному
__attribute__((nonnull))как требующему ненулевого значения. -Wno-analyzer-null-dereference-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-null-dereference для его отключения.
Эта диагностика предупреждает о путях в коде, в которых известное значение NULL разыменовывается.
-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 для его отключения.
Эта диагностика предупреждает о путях в коде, в которых функция, известная как async-signal-unsafe (например,
fprintf), вызывается из обработчика сигналов. -Wno-analyzer-use-after-free-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-use-after-free для его отключения.
Эта диагностика предупреждает о путях в коде, в которых указатель используется после вызова
freeна нём. -Wno-analyzer-use-of-pointer-in-stale-stack-frame-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-use-of-pointer-in-stale-stack-frame для его отключения.
Эта диагностика предупреждает о путях в коде, в которых разыменовывается указатель, указывающий на переменную в устаревшем кадре стека.
Соответствующие параметры для управления исследованием: --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, и для их включения требуется этот параметр. -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’
-
Как и на предыдущем уровне, но также отображаются события, относящиеся к потоку управления, которые важны для возникновения проблемы (например, «пройденный путь true» на условном операторе).
Этот уровень является по умолчанию.
- ‘3’
-
Как и на предыдущем уровне, но отображаются все события потока управления, а не только значимые.
- ‘4’
-
Этот уровень предназначен для разработчиков анализатора; он добавляет различные другие события, предназначенные для отладки анализатора.
-fdump-analyzer-
Выводит внутренние детали о том, что делает анализатор, в файл.analyzer.txt. Этот параметр переопределяется параметром -fdump-analyzer-stderr.
-fdump-analyzer-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-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-10.5.0/gcc/Static-Analyzer-Options.html