[Bug analyzer/100116] New: analyzer event messages for conditionals have the sense of the gimple IR rather than the source
dmalcolm at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Apr 16 14:01:48 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100116
Bug ID: 100116
Summary: analyzer event messages for conditionals have the
sense of the gimple IR rather than the source
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: analyzer
Assignee: dmalcolm at gcc dot gnu.org
Reporter: dmalcolm at gcc dot gnu.org
Target Milestone: ---
Consider:
$ cat v.c
# define LIKELY(x) __builtin_expect(!!(x), 1)
__attribute__ ((__noreturn__))
extern void vex_assert_fail ( const char* expr, const char* file,
int line, const char* fn );
#define vassert(expr) \
((void) (LIKELY(expr) ? 0 : \
(vex_assert_fail (#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__),
0)))
void test (int nbuf)
{
vassert(nbuf >= 32);
__analyzer_dump_path ();
}
$ ./xgcc -B. -S -fanalyzer v.c -fdump-ipa-analyzer=stderr
v.c: In function ‘test’:
v.c:14:4: warning: implicit declaration of function ‘__analyzer_dump_path’
[-Wimplicit-function-declaration]
14 | __analyzer_dump_path ();
| ^~~~~~~~~~~~~~~~~~~~
v.c:14:4: note: path
14 | __analyzer_dump_path ();
| ^~~~~~~~~~~~~~~~~~~~~~~
‘test’: event 1
|
| 8 | ((void) (LIKELY(expr) ? 0 : \
| | ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (1) following ‘false’ branch...
| 9 | (vex_assert_fail (#expr, __FILE__, __LINE__,
__PRETTY_FUNCTION__), 0)))
| |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
v.c:13:4: note: in expansion of macro ‘vassert’
| 13 | vassert(nbuf >= 32);
| | ^~~~~~~
|
‘test’: events 2-3
|
| 14 | __analyzer_dump_path ();
| | ^~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (2) ...to here
| | (3) here
|
void test (int nbuf)
{
static const char __PRETTY_FUNCTION__[5] = "test";
_Bool _1;
long int _2;
long int _3;
<bb 2> :
_1 = nbuf_4(D) > 31;
_2 = (long int) _1;
_3 = __builtin_expect (_2, 1);
if (_3 == 0)
goto <bb 3>; [INV]
else
goto <bb 4>; [INV]
<bb 3> :
vex_assert_fail ("nbuf >= 32", "v.c", 13, &__PRETTY_FUNCTION__);
<bb 4> :
__analyzer_dump_path ();
return;
}
Note how event (1) in the path reads:
(1) following ‘false’ branch...
It is indeed following the false branch in the gimple IR (from <bb 2> to <bb
4>), skipping the vex_assert_fail, but this is confusing to the user, since
it's following the *true* path from the perspective of the user's source code:
(LIKELY(expr) ? 0 : \
(vex_assert_fail (#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__),
0)))
i.e. where LIKELY(expr) is true.
Such messages should refer to the user's source code, not to our IR.
More information about the Gcc-bugs
mailing list