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-null-argument -Wanalyzer-null-dereference -Wanalyzer-possible-null-argument -Wanalyzer-possible-null-dereference -Wanalyzer-shift-count-negative -Wanalyzer-shift-count-overflow -Wanalyzer-stale-setjmp-buffer -Wanalyzer-unsafe-call-within-signal-handler -Wanalyzer-use-after-free -Wanalyzer-use-of-pointer-in-stale-stack-frame -Wanalyzer-use-of-uninitialized-value -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 для его отключения.
Это диагностическое сообщение предупреждает о путях в коде, в которых потенциально-NULL значение передается в аргумент функции, помеченный
__attribute__((nonnull))как требующий не-NULL значение. -Wno-analyzer-possible-null-dereference-
Для этого предупреждения требуется -fanalyzer, который его включает; используйте -Wno-analyzer-possible-null-dereference для его отключения.
Это диагностическое сообщение предупреждает о путях в коде, в которых обращается к потенциально-NULL значению.
-Wno-analyzer-null-argument-
Для этого предупреждения требуется -fanalyzer, который его включает; используйте -Wno-analyzer-null-argument для его отключения.
Это диагностическое сообщение предупреждает о путях в коде, в которых значение, известное как NULL, передается в аргумент функции, помеченный
__attribute__((nonnull))как требующее не-NULL значение. -Wno-analyzer-null-dereference-
Для этого предупреждения требуется -fanalyzer, который его включает; используйте -Wno-analyzer-null-dereference для его отключения.
Это диагностическое сообщение предупреждает о путях в коде, в которых к значению, известному как NULL, обращается.
-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-allocation-size-
Для этого предупреждения требуется как -fanalyzer, так и -fanalyzer-checker=taint для его включения; используйте -Wno-analyzer-tainted-allocation-size для его отключения.
Это диагностическое сообщение предупреждает о путях в коде, в которых значение, которое может быть под контролем злоумышленника, используется в качестве размера выделения без проверки, чтобы злоумышленник мог ввести чрезмерно большой размер выделения и потенциально вызвать отказ в обслуживании.
См. CWE-789: Выделение памяти с чрезмерно большим значением размера.
-Wno-analyzer-tainted-array-index-
Для этого предупреждения требуется как -fanalyzer, так и -fanalyzer-checker=taint для его включения; используйте -Wno-analyzer-tainted-array-index для его отключения.
Это диагностическое сообщение предупреждает о путях в коде, в которых значение, которое может быть под контролем злоумышленника, используется в качестве индекса доступа к массиву без проверки, чтобы злоумышленник мог выполнить доступ за пределами границ.
-Wno-analyzer-tainted-divisor-
Для этого предупреждения требуется как -fanalyzer, так и -fanalyzer-checker=taint для его включения; используйте -Wno-analyzer-tainted-divisor для его отключения.
Это диагностическое сообщение предупреждает о путях в коде, в которых значение, которое может быть под контролем злоумышленника, используется в качестве делителя в операции деления или модуля без проверки, чтобы злоумышленник мог ввести деление на ноль.
-Wno-analyzer-tainted-offset-
Для этого предупреждения требуется как -fanalyzer, так и -fanalyzer-checker=taint для его включения; используйте -Wno-analyzer-tainted-offset для его отключения.
Это диагностическое сообщение предупреждает о путях в коде, в которых значение, которое может быть под контролем злоумышленника, используется в качестве смещения указателя без проверки, чтобы злоумышленник мог выполнить доступ за пределами границ.
См. CWE-823: Использование смещения указателя вне диапазона.
-Wno-analyzer-tainted-size-
Для этого предупреждения требуется как -fanalyzer, так и -fanalyzer-checker=taint для его включения; используйте -Wno-analyzer-tainted-size для его отключения.
Это диагностическое сообщение предупреждает о путях в коде, в которых значение, которое может быть под контролем злоумышленника, используется в качестве размера операции, такой как
memsetбез проверки, чтобы злоумышленник мог выполнить доступ за пределами границ. -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 для его отключения.
Данная диагностика предупреждает о путях в коде, где анализатор обнаруживает попытку записи через указатель на строковый литерал. Однако анализатор не уделяет приоритет обнаружению таких путей, поэтому ложноотрицательные результаты более вероятны по сравнению с другими предупреждениями.
-Wno-analyzer-use-of-uninitialized-value-
Это предупреждение требует -fanalyzer, которое его включает; используйте -Wno-analyzer-use-of-uninitialized-value для его отключения.
Данная диагностика предупреждает о путях в коде, где используется неинициализированное значение.
Соответствующие параметры для управления исследованием: --param analyzer-bb-explosion-factor=value, --param analyzer-max-enodes-per-program-point=value, --param analyzer-max-recursion-depth=value и --param analyzer-min-snodes-for-call-summary=value.
Следующие параметры управляют анализатором.
-fanalyzer-call-summaries-
Упростить межпроцедурный анализ, вычислив эффект определённых вызовов, вместо исследования всех путей через функцию от места вызова до каждого возможного возврата.
Если включено, то резюме вызовов используются только для функций с более чем одним местом вызова и достаточно сложными (согласно --param analyzer-min-snodes-for-call-summary=value).
-fanalyzer-checker=name-
Ограничить анализатор запуском только указанного проверяющего средства и включить его.
Некоторые проверяющие средства по умолчанию отключены (даже с -fanalyzer), например, проверяющее средство
taint, реализующее -Wanalyzer-tainted-array-index, и этот параметр необходим для их включения.Примечание: в настоящее время -fanalyzer-checker=taint отключает следующие предупреждения от -fanalyzer:
-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-null-argument -Wanalyzer-null-dereference -Wanalyzer-possible-null-argument -Wanalyzer-possible-null-dereference -Wanalyzer-unsafe-call-within-signal-handler -Wanalyzer-use-after-free
-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-
Этот параметр управляет сложностью путей потока управления, которые выводятся для диагностических сообщений анализатора.
Значение level может быть одним из следующих:
- ‘0’
-
На этом уровне отображаются межпроцедурные события вызова и возврата, а также наиболее важные события изменения состояния, относящиеся к диагностическому сообщению. Например, для диагностики двойного
freeотображаются оба вызоваfree. - ‘1’
-
Как и на предыдущем уровне, но также отображаются события входа в каждую функцию.
- ‘2’
-
Как и на предыдущем уровне, но также отображаются события, относящиеся к потоку управления, которые важны для срабатывания проблемы (например, «путь истинности выбран» в условном операторе).
Этот уровень является по умолчанию.
- ‘3’
-
Как и на предыдущем уровне, но отображаются все события потока управления, а не только важные.
- ‘4’
-
Этот уровень предназначен для разработчиков анализатора; он добавляет различные другие события, предназначенные для отладки анализатора.
-fdump-analyzer-
Вывести внутренние детали о том, что делает анализатор, в file.analyzer.txt. Этот параметр переопределяется параметром -fdump-analyzer-stderr.
-fdump-analyzer-stderr-
Вывести внутренние детали о том, что делает анализатор, в stderr. Этот параметр переопределяет -fdump-analyzer.
-fdump-analyzer-callgraph-
Вывести представление графа вызовов, подходящее для просмотра с помощью GraphViz, в file.callgraph.dot.
-fdump-analyzer-exploded-graph-
Вывести представление «взрывного графа», подходящее для просмотра с помощью GraphViz, в file.eg.dot. Узлы имеют цветовую кодировку, основанную на состояниях автомата, чтобы подчеркнуть изменения состояний.
-fdump-analyzer-exploded-nodes-
Вывести диагностические сообщения, показывающие, где узлы «взрывного графа» находятся относительно исходного кода программы.
-fdump-analyzer-exploded-nodes-2-
Вывести текстовое представление «взрывного графа» в file.eg.txt.
-fdump-analyzer-exploded-nodes-3-
Вывести текстовое представление «взрывного графа» в отдельный файл на узел в file.eg-id.txt. Обычно это большое количество файлов.
-fdump-analyzer-exploded-paths-
Вывести текстовое представление «взрывного пути» для каждого диагностического сообщения в file.idx.kind.epath.txt.
-fdump-analyzer-feasibility-
Вывести внутренние детали поиска выполнимых путей анализатором. Детали записываются в формате, подходящем для просмотра с помощью GraphViz, в файлы с именами вида file.*.fg.dot, file.*.tg.dot и file.*.fpath.txt.
-fdump-analyzer-json-
Вывести сжатое представление анализатора в формате JSON в file.analyzer.json.gz. Точный формат может изменяться.
-fdump-analyzer-state-purge-
Как и -fdump-analyzer-supergraph, вывести представление «суперграфа», подходящее для просмотра с помощью GraphViz, но аннотировать граф информацией о том, какое состояние будет удалено в каждом узле. Граф записывается в file.state-purge.dot.
-fdump-analyzer-supergraph-
Вывести представления «суперграфа», подходящие для просмотра с помощью GraphViz, в file.supergraph.dot и file.supergraph-eg.dot. Они показывают все графы потока управления в программе с межпроцедурными рёбрами для вызовов и возвратов. Второй вывод содержит аннотации, показывающие узлы «взрывного графа» и связанные с ними диагностические сообщения.
-fdump-analyzer-untracked-
Вывести пользовательские предупреждения с внутренними подробностями, предназначенными для разработчиков анализатора.
Далее: Параметры отладки, Предыдущее: Параметры предупреждений, Наверх: Вызов GCC [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Static-Analyzer-Options.html