https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108381
Bug ID: 108381
Summary: GCC Static Analyzer evaluates ( ((c)<=(b)) &&
((c)!=(b)) ) == false to be FALSE with the fact c >= b
Product: gcc
Version: 13.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: analyzer
Assignee: dmalcolm at gcc dot gnu.org
Reporter: geoffreydgr at icloud dot com
Target Milestone: ---
Hi, i found a problem that GCC Static Analyzer evaluates `( ((c)<=(b)) &&
((c)!=(b)) ) == false ` to be FALSE with the fact `c >= b`. However, CSA does
not have this problem.
GSA: https://godbolt.org/z/qjEvndsxT
CSA: https://godbolt.org/z/zMYheK7Pf
Compiler options: -O0 -fanalyzer
Input:
```c
#include "stdint.h"
#include <stdbool.h>
int a(int* b, int *c) {
d:
if (c >= b) {
__analyzer_eval((!(c >= b))==false);
__analyzer_eval((((c)<=(b))&&((c)!=(b)))==false);
__analyzer_eval(true);
goto d;
}
}
```
Output:
```bash
<source>: In function 'a':
<source>:10:5: warning: implicit declaration of function '__analyzer_eval'
[-Wimplicit-function-declaration]
10 | __analyzer_eval((!(c >= b))==false);
| ^~~~~~~~~~~~~~~
<source>:10:5: warning: TRUE
10 | __analyzer_eval((!(c >= b))==false);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:11:5: warning: FALSE
11 | __analyzer_eval((((c)<=(b))&&((c)!=(b)))==false);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:12:5: warning: TRUE
12 | __analyzer_eval(true);
| ^~~~~~~~~~~~~~~~~~~~~
<source>:11:5: warning: UNKNOWN
11 | __analyzer_eval((((c)<=(b))&&((c)!=(b)))==false);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:12:5: warning: TRUE
12 | __analyzer_eval(true);
| ^~~~~~~~~~~~~~~~~~~~~
Compiler returned: 0
```