analyzer: getchar has no side-effects

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.
This commit is contained in:
David Malcolm 2020-09-16 13:12:39 -04:00
parent 3f4b15f52f
commit e097c9ab83
2 changed files with 24 additions and 0 deletions

View file

@ -732,6 +732,11 @@ region_model::on_call_pre (const gcall *call, region_model_context *ctxt)
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);

View file

@ -0,0 +1,19 @@
#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;
}