https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71970
Bug ID: 71970
Summary: Exponential Compilation Time with Undefined Behavior
Sanitizer
Product: gcc
Version: 6.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: philipp.ochsendorf+gcc at gmail dot com
Target Milestone: ---
In the following, standalone example compilation with g++ (6.1.0) takes ~2 sec
to compile (with -std=c++11 -fsanitize=undefined -c flags):
struct Stream {
Stream & operator<<(const char *);
virtual void ensure_vtable(); // Important!
};
struct Worker {
~Worker();
};
Worker::~Worker() {
Stream()
<< ""
<< ""
<< ""
<< ""
<< ""
<< ""
<< ""
<< ""
<< ""
<< ""
<< "";
}
We tried minimizing the example further, but apparently the following details
are important:
- The -fsanitize=undefined flag.
- The presence of any virtual function in Stream.
- The actual code being located in some destructor.
More precisely the compilation time depends exponentially on the number k of
<< ""
lines. Here are samples for some values of k:
k Compile Time (sec)
8 0.05
9 0.21
10 0.57
11 2.02
12 7.78
13 31.83
14 123.51
15 512.72
16 2040.83
17 9572.19
18 33663.81
Apparently compilation takes roughly 4^k.