2016-01-12 18:07:56 +08:00
// This test checks that intersecting ranges does not cause 'system is over constrained' assertions in the case of eg: 32 bits unsigned integers getting their range from 64 bits signed integers.
2017-03-04 02:02:02 +08:00
// RUN: %clang_analyze_cc1 -triple x86_64-pc-linux-gnu -analyzer-checker=core,debug.ExprInspection -analyzer-store=region -verify %s
2016-01-12 18:07:56 +08:00
void clang_analyzer_warnIfReached ( ) ;
void f1 ( long foo )
{
unsigned index = - 1 ;
if ( index < foo ) index = foo ;
if ( index + 1 = = 0 ) // because of foo range, index is in range [0; UINT_MAX]
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}
void f2 ( unsigned long foo )
{
int index = - 1 ;
if ( index < foo ) index = foo ; // index equals ULONG_MAX
if ( index + 1 = = 0 )
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
else
clang_analyzer_warnIfReached ( ) ; // no-warning
}
void f3 ( unsigned long foo )
{
unsigned index = - 1 ;
if ( index < foo ) index = foo ;
if ( index + 1 = = 0 )
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}
void f4 ( long foo )
{
int index = - 1 ;
if ( index < foo ) index = foo ;
if ( index + 1 = = 0 )
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}
void f5 ( long foo )
{
unsigned index = - 1 ;
if ( index < foo ) index = foo ;
if ( index = = - 1 )
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}
void f6 ( long foo )
{
unsigned index = - 1 ;
if ( index < foo ) index = foo ;
if ( index = = - 1 )
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}
void f7 ( long foo )
{
unsigned index = - 1 ;
if ( index < foo ) index = foo ;
2017-07-13 03:37:57 +08:00
if ( index - 1 = = 0 )
clang_analyzer_warnIfReached ( ) ; // no-warning
2016-01-12 18:07:56 +08:00
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}
2016-01-12 18:40:45 +08:00
void f8 ( long foo )
{
unsigned index = - 1 ;
if ( index < foo ) index = foo ;
if ( index + 1L = = 0L )
clang_analyzer_warnIfReached ( ) ; // no-warning
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}
2016-01-12 18:07:56 +08:00
void f9 ( long foo )
{
unsigned index = - 1 ;
if ( index < foo ) index = foo ;
2017-07-13 03:37:57 +08:00
if ( index - 1L = = 0L )
clang_analyzer_warnIfReached ( ) ; // no-warning
2016-01-12 18:07:56 +08:00
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}
void f10 ( long foo )
{
unsigned index = - 1 ;
if ( index < foo ) index = foo ;
if ( index + 1 = = 0L )
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}
2016-01-12 18:40:45 +08:00
void f11 ( long foo )
{
unsigned index = - 1 ;
if ( index < foo ) index = foo ;
if ( index + 1UL = = 0L )
clang_analyzer_warnIfReached ( ) ; // no-warning
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}
2016-01-12 18:07:56 +08:00
void f12 ( long foo )
{
unsigned index = - 1 ;
if ( index < foo ) index = foo ;
2017-07-13 03:37:57 +08:00
if ( index - 1UL = = 0L )
clang_analyzer_warnIfReached ( ) ; // no-warning
2016-01-12 18:07:56 +08:00
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}
2016-01-12 18:40:45 +08:00
void f13 ( int foo )
{
unsigned short index = - 1 ;
if ( index < foo ) index = foo ;
if ( index + 1 = = 0 )
clang_analyzer_warnIfReached ( ) ; // no-warning
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}
2016-01-12 18:07:56 +08:00
void f14 ( long foo )
{
unsigned index = - 1 ;
if ( index < foo ) index = foo ;
long bar = foo ;
if ( index + 1 = = 0 )
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}
void f15 ( long foo )
{
unsigned index = - 1 ;
if ( index < foo ) index = foo ;
unsigned int tmp = index + 1 ;
if ( tmp = = 0 )
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
else
clang_analyzer_warnIfReached ( ) ; // expected-warning{{REACHABLE}}
}