On Tue, 2022-04-12 at 10:03 -0400, David Malcolm wrote: > I've pushed the following change to the website, covering -fanalyzer > changes in GCC 12.
(sorry, forgot to put wwwdocs in the subject) > > --- > htdocs/gcc-12/changes.html | 115 > +++++++++++++++++++++++++++++++++++++ > 1 file changed, 115 insertions(+) > > diff --git a/htdocs/gcc-12/changes.html b/htdocs/gcc-12/changes.html > index 4652304d..d907ed22 100644 > --- a/htdocs/gcc-12/changes.html > +++ b/htdocs/gcc-12/changes.html > @@ -749,6 +749,121 @@ function Multiply (S1, S2 : Sign) return Sign > is > <!-- > .................................................................. -- > > > <!-- <h2>Documentation improvements</h2> --> > > +<h2 id="analyzer">Improvements to Static Analyzer</h2> > +<ul> > + <li>The analyzer has gained a <a href=" > https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html#index-Wanalyzer-use-of-uninitialized-value > "><code>-Wanalyzer-use-of-uninitialized-value</code></a> > + warning, similar to > + <a href=" > https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wuninitialized > "><code>-Wuninitialized</code></a> > + and > + <a href=" > https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wmaybe-uninitialized > "><code>-Wmaybe-uninitialized</code></a>, > + but based on an interprocedural path-sensitive analysis > + (<a href="https://gcc.gnu.org/PR95006">PR95006</a>). > + <p>Such warnings are not disabled by the new > + <a href=" > https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-ftrivial-auto-var-init > "><code>-ftrivial-auto-var-init</code></a> > + (see below), as the latter is considered a mitigation > option.</p> > + </li> > + <li><a href=" > https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html#index-Wanalyzer-write-to-const > "><code>-Wanalyzer-write-to-const</code></a> > + and > + <a href=" > https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html#index-Wanalyzer-write-to-string-literal > "><code>-Wanalyzer-write-to-string-literal</code></a> > + will now check for > + <a href=" > https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html">< > code>__attribute__ ((access, ....))</code></a> > + on calls to externally-defined functions, and complain about > read-only > + regions pointed to by arguments marked with a > <code>write_only</code> > + or <code>read_write</code> attribute > + (<a href="https://gcc.gnu.org/PR104793">PR104793</a>). > + </li> > + <li>The analyzer's "taint" mode, activated by > + <a href=" > https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html#index-fanalyzer-checker > "><code>-fanalyzer-checker=taint</code></a> > + (in addition to <a href=" > https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html#index-fanalyzer > "><code>-fanalyzer</code></a>), > + has gained four new taint-based warnings: > + <ul> > + <li><a href=" > https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html#index-Wanalyzer-tainted-allocation-size > "><code>-Wanalyzer-tainted-allocation-size</code></a> > + for e.g. attacker-controlled <code>malloc</code> > + and <code>alloca</code>, > + </li> > + <li><a href=" > https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html#index-Wanalyzer-tainted-divisor > "><code>-Wanalyzer-tainted-divisor</code></a> > + for detecting where an attacker can inject a divide-by-zero, > + </li> > + <li><a href=" > https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html#index-Wanalyzer-tainted-offset > "><code>-Wanalyzer-tainted-offset</code></a> > + for attacker-controlled pointer offsets, > + </li> > + <li><a href=" > https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html#index-Wanalyzer-tainted-size > "><code>-Wanalyzer-tainted-size</code></a> > + for attacker-controlled values being used as a size > parameter to > + calls to <code>memset</code> or to functions marked with > + <a href=" > https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html">< > code>__attribute__ ((access, ....))</code></a>. > + </li> > + </ul> > + <p>The existing > + <a href=" > https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html#index-Wanalyzer-tainted-array-index > "><code>-Wanalyzer-tainted-array-index</code></a> > + has been reworded to talk about "attacker-controlled" rather > than > + "tainted" values, for consistency with the new warnings. > + </p> > + <p>A new <a href=" > https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-tainted_005fargs-function-attribute > "><code>__attribute__ ((tainted_args))</code></a> has been > + added to the C and C++ frontends, usable on functions, and on > + function pointer callback fields in structs. The analyzer's > taint > + mode will treat all parameters and buffers pointed to by > parameters > + of such functions as being attacked-controlled, such as for > + annotating system calls in an operating system kernel as being > an > + "attack surface". > + </p> > + </li> > + <li>The analyzer now respects > + <a href=" > https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-const-function-attribute > "><code>__attribute__((const))</code></a>: > + it will treat such functions as returning the same value when > given > + the same inputs (<a > href="https://gcc.gnu.org/PR104434">PR104434</a>), > + and as having no side effects (<a href=" > https://gcc.gnu.org/PR104576">PR104576</a>). > + </li> > + <li>The analyzer is now able to split its analysis into multiple > + execution paths in places where there isn't a split in the > control > + flow graph. For example, it now handles <code>realloc</code> > calls by > + splitting the execution path into three possible outcomes for > the > + call: > + <ul> > + <li>failure, returning <code>NULL</code></li> > + <li>success, growing the buffer in-place without moving > it</li> > + <li>success, allocating a new buffer, copying the content of > the old > + buffer to it, and freeing the old buffer</li> > + </ul> > + </li> > + <li>The analyzer's interprocedural path exploration logic is now > able to > + track calls through function pointers. > + </li> > + <li>The analyzer now makes the assumption that if we know PTR is > non-NULL, > + then (PTR + OFFSET) is also non-NULL. This isn't strictly true, > but > + eliminates false positives in practice > + (<a href="https://gcc.gnu.org/PR101962">PR101962</a>). > + </li> > + <li>The analyzer has gained some initial support for inline > assembler > + code. This is extremely limited, and is purely to help suppress > + false positives when analyzing the Linux kernel, which makes > heavy > + use of inline assembler (<a > href="https://gcc.gnu.org/PR101570">PR101570</a>). > + </li> > + <li>The way the analyzer tracks the state of memory along an > execution > + path has been improved in various ways for GCC 12: > + <ul> > + <li>An optimization for representing bulk updates to memory > (e.g. > + zero fills) has been removed as it never worked well. In GCC > 12 > + it has been replaced with a simpler and more accurate > approach, > + eliminating many false positives > + (<a href="https://gcc.gnu.org/PR95006">PR95006</a>). > + </li> > + <li>Various optimizations have been added, speeding up the > analysis > + on a particularly problematic source file from 4 minutes down > to > + 17 seconds > + (<a href="https://gcc.gnu.org/PR104943">PR104943</a>, > + <a href="https://gcc.gnu.org/PR104954">PR104954</a>, and > + <a href="https://gcc.gnu.org/PR104955">PR104955</a>). > + </li> > + <li>The analyzer now tracks the sizes of dynamically-allocated > regions, > + both on the heap (via <code>malloc</code> etc) and stack > + (via <code>alloca</code>), though none of the analyzer > warnings make > + use of this yet in GCC 12.</li> > + </ul> > + </li> > + <li>The analyzer's handling of switch statements has been > rewritten, > + fixing various bugs. > + </li> > +</ul> > > <!-- > .................................................................. -- > > > <!-- <h2 id="plugins">Improvements for plugin authors</h2> -->