[Analyzer] Stable iteration on indirect goto LabelDecl's to avoid non-determinism...
authorAleksei Sidorin <a.sidorin@samsung.com>
Tue, 21 Nov 2017 11:27:47 +0000 (11:27 +0000)
committerAleksei Sidorin <a.sidorin@samsung.com>
Tue, 21 Nov 2017 11:27:47 +0000 (11:27 +0000)
commit124f5de84134095ac4cfa88eecfec1cf39995516
treedd6c67848cf533eabd2f2211dac58b18387b1e94
parent7ac9be1ab7def8af270ea4af430fb59eb89a2239
[Analyzer] Stable iteration on indirect goto LabelDecl's to avoid non-determinism (attempt 2)

CFG wass built in non-deterministic order due to the fact that indirect
goto labels' declarations (LabelDecl's) are stored in the llvm::SmallSet
container. LabelDecl's are pointers, whose order is not deterministic,
and llvm::SmallSet sorts them by their non-deterministic addresses after
"small" container is exceeded. This leads to non-deterministic processing
of the elements of the container.

The fix is to use llvm::SmallSetVector that was designed to have
deterministic iteration order.

Patch by Ilya Palachev!

Differential Revision: https://reviews.llvm.org/D40073

llvm-svn: 318754
clang/lib/Analysis/CFG.cpp
clang/test/Analysis/cfg-indirect-goto-determinism.cpp [new file with mode: 0644]