Range errors (dereferencing or incrementing the past-the-end iterator or decrementing the iterator of the first element of the range) and access of invalidated iterators lead to undefined behavior. There is no point to continue the analysis after such an error on the same execution path, but terminate it by a sink node (fatal error). This also improves the performance and helps avoiding double reports (e.g. in case of nested iterators). Differential Revision: https://reviews.llvm.org/D62893 llvm-svn: 370314
25 lines
875 B
C++
25 lines
875 B
C++
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config suppress-c++-stdlib=false -verify %s
|
|
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config suppress-c++-stdlib=true -DSUPPRESSED=1 -verify %s
|
|
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -DSUPPRESSED=1 -verify %s
|
|
|
|
#ifdef SUPPRESSED
|
|
// expected-no-diagnostics
|
|
#endif
|
|
|
|
#include "../Inputs/system-header-simulator-cxx.h"
|
|
|
|
void clang_analyzer_eval(bool);
|
|
|
|
class C {
|
|
// The virtual function is to make C not trivially copy assignable so that we call the
|
|
// variant of std::copy() that does not defer to memmove().
|
|
virtual int f();
|
|
};
|
|
|
|
void testCopyNull(C *I, C *E) {
|
|
std::copy(I, E, (C *)0);
|
|
#ifndef SUPPRESSED
|
|
// expected-warning@../Inputs/system-header-simulator-cxx.h:686 {{Called C++ object pointer is null}}
|
|
#endif
|
|
}
|