2019-10-19 08:08:17 +08:00
/ / RUN : % clang_analyze_cc1 % s - std = c + + 14 - analyzer - output = text - verify \
[Analyzer] Checker for non-determinism caused by iteration of unordered container of pointers
Summary: Added a checker for non-determinism caused by iterating unordered containers like std::unordered_set containing pointer elements.
Reviewers: NoQ, george.karpenkov, whisperity, Szelethus, baloghadamsoftware
Reviewed By: Szelethus
Subscribers: mgorny, xazax.hun, baloghadamsoftware, szepet, rnkovacs, a.sidorin, mikhail.ramalho, donat.nagy, dkrupp, jdoerfert, Charusso, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D59279
llvm-svn: 361664
2019-05-25 03:24:08 +08:00
// RUN: -analyzer-checker=core,alpha.nondeterminism.PointerIteration
# include "Inputs/system-header-simulator-cxx.h"
template < class T >
void f ( T x ) ;
void PointerIteration ( ) {
int a = 1 , b = 2 ;
std : : set < int > OrderedIntSet = { a , b } ;
std : : set < int * > OrderedPtrSet = { & a , & b } ;
std : : unordered_set < int > UnorderedIntSet = { a , b } ;
std : : unordered_set < int * > UnorderedPtrSet = { & a , & b } ;
for ( auto i : OrderedIntSet ) // no-warning
f ( i ) ;
for ( auto i : OrderedPtrSet ) // no-warning
f ( i ) ;
for ( auto i : UnorderedIntSet ) // no-warning
f ( i ) ;
for ( auto i : UnorderedPtrSet ) // expected-warning {{Iteration of pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerIteration]
// expected-note@-1 {{Iteration of pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerIteration]
f ( i ) ;
}