Discussions
Categories
- 385.5K All Categories
- 5.1K Data
- 2.5K Big Data Appliance
- 2.5K Data Science
- 453.4K Databases
- 223.2K General Database Discussions
- 3.8K Java and JavaScript in the Database
- 47 Multilingual Engine
- 606 MySQL Community Space
- 486 NoSQL Database
- 7.9K Oracle Database Express Edition (XE)
- 3.2K ORDS, SODA & JSON in the Database
- 585 SQLcl
- 4K SQL Developer Data Modeler
- 188K SQL & PL/SQL
- 21.5K SQL Developer
- 46 Data Integration
- 46 GoldenGate
- 298.4K Development
- 4 Application Development
- 20 Developer Projects
- 166 Programming Languages
- 295K Development Tools
- 150 DevOps
- 3.1K QA/Testing
- 646.7K Java
- 37 Java Learning Subscription
- 37.1K Database Connectivity
- 201 Java Community Process
- 108 Java 25
- 22.2K Java APIs
- 138.3K Java Development Tools
- 165.4K Java EE (Java Enterprise Edition)
- 22 Java Essentials
- 176 Java 8 Questions
- 86K Java Programming
- 82 Java Puzzle Ball
- 65.1K New To Java
- 1.7K Training / Learning / Certification
- 13.8K Java HotSpot Virtual Machine
- 94.3K Java SE
- 13.8K Java Security
- 208 Java User Groups
- 25 JavaScript - Nashorn
- Programs
- 667 LiveLabs
- 41 Workshops
- 10.3K Software
- 6.7K Berkeley DB Family
- 3.6K JHeadstart
- 6K Other Languages
- 2.3K Chinese
- 207 Deutsche Oracle Community
- 1.1K Español
- 1.9K Japanese
- 474 Portuguese
Studio 12.5 miscompiles std::atomic<int>::fetch_add

Studio 12.5 C++ compiler generates incorrect code for fetch_add method in std::atomic
The problem occurs at optimization level -xO3 and higher
#include <atomic>std::atomic<int> counter = ATOMIC_VAR_INIT(0);int main(){ if (counter.fetch_add(1, std::memory_order_release) == 0) counter.fetch_sub(1, std::memory_order_release); return counter;}
The if generates following assembly:
{ 514 } movl $1,%eax{ 514 } lock xaddl %eax,counter{ } movl %eax,-12(%ebp) / sym=.CV0{ 514 } jne .L77000030.57{ 524 } .L77000028.58:{ 524 } movl $-1,%eax{ 524 } lock xaddl %eax,counter{ 396 } .L77000030.57:{ 396 } movl counter,%eax
The jump (514) suggests that the optimizer assumes xaddl setting flags for the original value (i.e. result of function fetch_add) which is wrong - xaddl sets the flags to represent result of addition, i.e. the new value
The bug causes QMutex class of Qt 5.9 to get into infinite loop, there is code which tests result of fetch_add against 0 like in my example.
Comments
-
> xaddl sets the flags to represent result of addition, i.e. the new value
Indeed, it should be doing something like:
xaddl %eax, counter
testl %eax, %eax
so current 12.5 behavior is surely a bug.
Studio 12.6 seems to be doing it right, so the bug must be fixed, though I cant tell exactly which bug fix it was.
You might want to switch to 12.6, as it has quite a share of C++11-related bug fixes.
regards,
Fedor.
-
Your problem looks like bug 24312660, which was fixed in Studio 12.6.
If you have a Studio service contract, you could request a fix in a patch via your support channel.
But as Fedor has already noted, upgrading to Studio 12.6 is likely a better solution.
-
I am giving a try to 12.6, seems like this bug disappeared indeed
-
The CR which fixed that problem is - 25726453