blob: 83ec1cab58be8ae79685f0f5728de6bc55758bb4 [file] [log] [blame]
#include "analyzer-decls.h"
void test_1 (void)
{
__analyzer_dump_path (); /* { dg-message "path" } */
}
void test_2 (int flag)
{
if (flag)
__analyzer_dump_path (); /* { dg-message "path" } */
}
void test_3 (int flag)
{
if (flag)
if (!flag)
__analyzer_dump_path (); /* { dg-bogus "path" } */
}
int global_for_test_4;
static void __attribute__((noinline)) called_by_test_4 () {}
void test_4 (void)
{
/* Verify that a state change that happens in a stmt that
isn't the first within its BB can affect path feasibility. */
global_for_test_4 = 0;
global_for_test_4 = 1;
/* Thwart the optimizer. */
called_by_test_4 ();
if (global_for_test_4)
__analyzer_dump_path (); /* { dg-message "path" } */
}
/* Verify that loops don't confuse the feasibility checker. */
void test_5 (void)
{
for (int i = 0; i < 1024; i++)
{
}
__analyzer_dump_path (); /* { dg-message "path" } */
}
/* Reproducer for an issue seen with CVE-2005-1689 (PR analyzer/96374): if we
take the shortest path and update state and check feasibility per-edge, we
can erroneously reject valid diagnostics. */
int test_6 (int a, int b)
{
int problem = 0;
if (a)
problem = 1;
if (b)
{
if (!problem)
problem = 2;
__analyzer_dump_path (); /* { dg-message "path" } */
}
return problem;
}
/* As above, but call a static function.
Even if the path to the call of called_by_test_6a is falsely rejected
as infeasible, it still makes sense to complain about errors within
the called function. */
static void __attribute__((noinline))
called_by_test_6a (void *ptr)
{
__builtin_free (ptr);
__builtin_free (ptr); /* { dg-message "double-'free'" } */
}
int test_6a (int a, int b, void *ptr)
{
int problem = 0;
if (a)
problem = 1;
if (b)
{
if (!problem)
problem = 2;
called_by_test_6a (ptr);
}
return problem;
}
/* After state-merging, the shortest path skips the loop,
but the shortest feasible path enters it. */
void test_7 (int n)
{
int entered_loop = 0;
int i;
for (i = 0; i < n; i++)
entered_loop = 1;
if (entered_loop)
__analyzer_dump_path (); /* { dg-message "path" } */
}