Seen whilst debugging another issue, where the analyzer was assuming
conservatively that a call to getchar could clobber a global.
This is handled for most of the other stdio functions by the list
in sm-file.cc
gcc/analyzer/ChangeLog:
* region-model.cc (region_model::on_call_pre): Treat getchar as
having no side-effects.
gcc/testsuite/ChangeLog:
* gcc.dg/analyzer/getchar-1.c: New test.
return impl_call_calloc (cd);
else if (is_named_call_p (callee_fndecl, "alloca", call, 1))
return impl_call_alloca (cd);
+ else if (is_named_call_p (callee_fndecl, "getchar", call, 0))
+ {
+ /* No side-effects (tracking stream state is out-of-scope
+ for the analyzer). */
+ }
else if (is_named_call_p (callee_fndecl, "memset", call, 3))
{
impl_call_memset (cd);
--- /dev/null
+#include <stdio.h>
+#include "analyzer-decls.h"
+
+int test_1 (void)
+{
+ int c = getchar ();
+ return c;
+}
+
+int glob_2;
+int test_2 (void)
+{
+ int c;
+ glob_2 = 42;
+ __analyzer_eval (glob_2 == 42); /* { dg-warning "TRUE" } */
+ c = getchar ();
+ __analyzer_eval (glob_2 == 42); /* { dg-warning "TRUE" } */
+ return c;
+}