Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- a[i] = i++;
- // This expression has three parts:
- (a) a[i]
- (b) i++
- (c) Assign (b) to (a)
- // (c) is guaranteed to happen after (a) and (b)
- // But (a) and (b) can be done in either order.
- // See n2521 Section 5.17
- // (b) increments i but returns the original value.
- // See n2521 Section 5.2.6
- // Thus this expression can be written as:
- int rhs = i++;
- int lhs& = a[i];
- lhs = rhs;
- // or
- int lhs& = a[i];
- int rhs = i++;
- lhs = rhs;
- A* a = new A("plop");
- // Looks simple enough.
- // But this can be split into three parts.
- (a) allocate Memory
- (b) Call constructor
- (c) Assign value to 'a'
- // No problem here:
- // The compiler is allowed to do this:
- (a) allocate Memory
- (c) Assign value to 'a'
- (b) Call constructor.
- // This is because the whole thing is between two sequence points.
- // So what is the big deal.
- // Simple Double checked lock. (I know there are many other problems with this).
- if (a == null) // (Point B)
- {
- Lock lock(mutex);
- if (a == null)
- {
- a = new A("Plop"); // (Point A).
- }
- }
- a->doStuff();
- // Think of this situation.
- // Thread 1: Reaches point A. Executes (a)(c)
- // Thread 1: Is about to do (b) and gets unscheduled.
- // Thread 2: Reaches point B. It can now skip the if block
- // Remember (c) has been done thus 'a' is not NULL.
- // But the memory has not been initialized.
- // Thread 2 now executes doStuff() on an uninitialized variable.
- // The solution to this problem is to move the assignment of 'a'
- // To the other side of the sequence point.
- if (a == null) // (Point B)
- {
- Lock lock(mutex);
- if (a == null)
- {
- A* tmp = new A("Plop"); // (Point A).
- a = tmp;
- }
- }
- a->doStuff();
- // Of course there are still other problems because of C++ support for
- // threads. But hopefully these are addresses in the next standard.
- // The simple obvious one.
- callFunc(getA(),getB());
- int a = getA();
- int b = getB();
- callFunc(a,b);
- int b = getB();
- int a = getA();
- callFunc(a,b);
- const int i = 10;
- int *p = const_cast<int*>( &i );
- *p = 1234; //Undefined
- int i =1;
- i = ++i;
- // Undefined. Assignment to i twice in the same expression.
Add Comment
Please, Sign In to add comment