On Tue, 2023-02-28 at 19:47 +0100, Hans-Peter Nilsson wrote: > Ok to commit? > -- >8 -- > Investigating analyzer tesstsuite errors for cris-elf. The same are > seen for pru-elf according to posts to gcc-testresults@. > > For glibc, errno is #defined as: > extern int *__errno_location (void) __THROW __attribute_const__; > # define errno (*__errno_location ()) > while for newlib in its default configuration, it's: > #define errno (*__errno()) > extern int *__errno (void);
We're already handling ___errno (three underscores) for Solaris as of 7c9717fcb5cf94ce1e7ef5c903058adf9980ff28; does it fix the issue if you add __errno (two underscores) to analyzer/kf.cc's register_known_functions in an analogous way to that commit? (i.e. wiring it up to kf_errno_location, "teaching" the analyzer that that function returns a pointer to the "errno region") Dave > > The critical difference is that __attribute__ ((__const__)), > where glibc says that the caller will see the same value on > all calls (from the same context; read: same thread). I'm > not sure the absence of __attribute__ ((__const__)) for the > newlib definition is deliberate, but I guess it can. > Either way, without the "const" attribute, it can't be known > that the same location will be returned the next time, so > analyzer-tests that depend the value being known it should > see UNKNOWN rather than TRUE, that's why the deliberate > check for UNKNOWN rather than xfailing the test. > > For isatty-1.c, it's the same problem, but here it'd be > unweildy with the extra dg-lines, so better just skip it for > newlib targets. > > testsuite: > * gcc.dg/analyzer/call-summaries-errno.c: Expect UNKNOWN > for newlib after having set errno. > * gcc.dg/analyzer/errno-1.c: Ditto. > * gcc.dg/analyzer/isatty-1.c: Skip for newlib targets. > --- > gcc/testsuite/gcc.dg/analyzer/call-summaries-errno.c | 3 ++- > gcc/testsuite/gcc.dg/analyzer/errno-1.c | 3 ++- > gcc/testsuite/gcc.dg/analyzer/isatty-1.c | 2 +- > 3 files changed, 5 insertions(+), 3 deletions(-) > > diff --git a/gcc/testsuite/gcc.dg/analyzer/call-summaries-errno.c > b/gcc/testsuite/gcc.dg/analyzer/call-summaries-errno.c > index e4333b30bb77..cf4d9f7141e4 100644 > --- a/gcc/testsuite/gcc.dg/analyzer/call-summaries-errno.c > +++ b/gcc/testsuite/gcc.dg/analyzer/call-summaries-errno.c > @@ -13,5 +13,6 @@ void test_sets_errno (int y) > sets_errno (y); > sets_errno (y); > > - __analyzer_eval (errno == y); /* { dg-warning "TRUE" } */ > + __analyzer_eval (errno == y); /* { dg-warning "TRUE" "errno is at > a constant location" { target { ! newlib } } } */ > + /* { dg-warning "UNKNOWN" "errno is not known to be at a constant > location" { target { newlib } } .-1 } */ > } > diff --git a/gcc/testsuite/gcc.dg/analyzer/errno-1.c > b/gcc/testsuite/gcc.dg/analyzer/errno-1.c > index 6b9d28c10799..af0cc3d52a36 100644 > --- a/gcc/testsuite/gcc.dg/analyzer/errno-1.c > +++ b/gcc/testsuite/gcc.dg/analyzer/errno-1.c > @@ -17,7 +17,8 @@ void test_storing_to_errno (int val) > { > __analyzer_eval (errno == val); /* { dg-warning "UNKNOWN" } */ > errno = val; > - __analyzer_eval (errno == val); /* { dg-warning "TRUE" } */ > + __analyzer_eval (errno == val); /* { dg-warning "TRUE" "errno is > at a constant location" { target { ! newlib } } } */ > + /* { dg-warning "UNKNOWN" "errno is not known to be at a constant > location" { target { newlib } } .-1 } */ > external_fn (); > __analyzer_eval (errno == val); /* { dg-warning "UNKNOWN" } */ > } > diff --git a/gcc/testsuite/gcc.dg/analyzer/isatty-1.c > b/gcc/testsuite/gcc.dg/analyzer/isatty-1.c > index 389d2cdf3f18..450a7d71990d 100644 > --- a/gcc/testsuite/gcc.dg/analyzer/isatty-1.c > +++ b/gcc/testsuite/gcc.dg/analyzer/isatty-1.c > @@ -1,4 +1,4 @@ > -/* { dg-skip-if "" { powerpc*-*-aix* } } */ > +/* { dg-skip-if "" { powerpc*-*-aix* || newlib } } */ > > #include <errno.h> > #include "analyzer-decls.h"