[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnats/78: g++ 2.95.2 copies without constructor, then calls destructor
From: |
pmorris |
Subject: |
gnats/78: g++ 2.95.2 copies without constructor, then calls destructor |
Date: |
26 May 2000 22:28:16 -0000 |
>Number: 78
>Category: gnats
>Synopsis: g++ 2.95.2 copies without constructor, then calls destructor
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Fri May 26 15:34:00 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator: Paul Morris and Will Edgington
>Release: g++-2.95.2 and earlier
>Organization:
>Environment:
Sun Ultra 2 SunOS 5.6 (Solaris)
>Description:
g++ compiles incorrectly. Under certain circumstances, it
creates a copy without calling the copy constructor, and
later passes the copy to the destructor. This can cause
reference-count schemes to prematurely release storage.
>How-To-Repeat:
Enclosed is a self-contained program that exercises the bug,
with print statements to illustrate the problem.
Note that the refCount goes to -1.(If the SUNWspro compiler
is used instead, the refCount correctly ends at 0.)
PRINTOUT FROM EXAMPLE PROGRAM
Created tag 1 item
refCount now 1
Created tag 2 item as copy of tag 1 item
refCount now 2
Created tag 3 item
Assigned tag 3 item as copy of tag 2 item
refCount now 3
Descoped tag 2 item
refCount now 2
Created tag 4 item as copy of tag 3 item
refCount now 3
Created tag 5 item
Assigned tag 5 item as copy of tag 4 impostor
refCount now 4
Descoped tag 4 impostor
refCount now 3
Descoped tag 4 item
refCount now 2
Descoped tag 5 item
refCount now 1
Descoped tag 3 item
refCount now 0
Descoped tag 1 item
refCount now -1
>Fix:
The compiler needs to be modified to call the copy
constructor when it makes the copy identified as the
"impostor" in the example printout.
>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: application/octet-stream; name="test.cc"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="test.cc"
I2luY2x1ZGUgPGlvc3RyZWFtLmg+CgpjbGFzcyBNb2RJZCB7CnB1YmxpYzoKICBNb2RJZCAoaW50
IGRhdHVtID0gMCk7CiAgTW9kSWQoY29uc3QgTW9kSWQmIG9yZyk7CiAgTW9kSWQmIG9wZXJhdG9y
PShjb25zdCBNb2RJZCYgb3JnKTsKICB+TW9kSWQgKCk7CiAgY2hhcioganVkZ2UoKSBjb25zdDsK
cHJpdmF0ZToKICBpbnQgdGFnOwogIGludCBkYXR1bTsKICBpbnQqIHJlZkNvdW50Owp9OwoKaW50
IHRvcFRhZyA9IDE7Ck1vZElkKiB0YWdQdHJbMTAwMF07CgpjaGFyKiBNb2RJZDo6anVkZ2UoKSBj
b25zdCAKeyByZXR1cm4gKHRoaXMgPT0gdGFnUHRyW3RoaXMtPnRhZ10pID8gIiBpdGVtICIgOiAi
IGltcG9zdG9yICI7IH0KCk1vZElkOjpNb2RJZCAoaW50IGRhdCkKewogIHRhZ1B0clt0YWcgPSB0
b3BUYWcrK10gPSB0aGlzOwogIGRhdHVtID0gZGF0OwogICoocmVmQ291bnQgPSBuZXcgaW50KSA9
IDE7CgogIGNlcnIgPDwgIkNyZWF0ZWQgdGFnICIgPDwgdGFnIDw8IGp1ZGdlKCkgPDwgIlxuIjsK
ICBpZiAoZGF0dW0pIGNlcnIgPDwgIiAgICAgcmVmQ291bnQgbm93ICIgPDwgKnJlZkNvdW50IDw8
ICJcbiI7Cn0KCk1vZElkOjpNb2RJZChjb25zdCBNb2RJZCYgb3JnKQp7CiAgdGFnUHRyW3RhZyA9
IHRvcFRhZysrXSA9IHRoaXM7CiAgZGF0dW0gPSBvcmcuZGF0dW07CiAgKCoocmVmQ291bnQgPSBv
cmcucmVmQ291bnQpKSsrOwoKICBjZXJyIDw8ICJDcmVhdGVkIHRhZyAiIDw8IHRhZyA8PCBqdWRn
ZSgpIDw8ICJhcyBjb3B5IG9mIHRhZyAiIDw8IG9yZy50YWcKICAgICAgIDw8IG9yZy5qdWRnZSgp
IDw8ICJcbiI7CiAgaWYgKGRhdHVtKSBjZXJyIDw8ICIgICAgIHJlZkNvdW50IG5vdyAiIDw8ICpy
ZWZDb3VudCA8PCAiXG4iOwp9CgpNb2RJZDo6fk1vZElkICgpCnsKICAoKnJlZkNvdW50KS0tOwoK
ICBjZXJyIDw8ICJEZXNjb3BlZCB0YWcgIiA8PCB0YWcgPDwganVkZ2UoKSA8PCAiXG4iOwogIGlm
IChkYXR1bSkgY2VyciA8PCAiICAgICByZWZDb3VudCBub3cgIiA8PCAqcmVmQ291bnQgPDwgIlxu
IjsKfQoKTW9kSWQmIE1vZElkOjpvcGVyYXRvcj0oY29uc3QgTW9kSWQmIG9yZykKewogICgqb3Jn
LnJlZkNvdW50KSsrOwogICgqcmVmQ291bnQpLS07CgogIGNlcnIgPDwgIkFzc2lnbmVkIHRhZyAi
IDw8IHRhZyA8PCBqdWRnZSgpIDw8ICJhcyBjb3B5IG9mIHRhZyAiIDw8IG9yZy50YWcKICAgICAg
IDw8IG9yZy5qdWRnZSgpIDw8ICJcbiI7CiAgaWYgKGRhdHVtICYmIG9yZy5kYXR1bSkKICAgIGNl
cnIgPDwgIiAgICAgcmVmQ291bnQgdW5jaGFuZ2VkIiA8PCAqcmVmQ291bnQgPDwgIlxuIjsKICBl
bHNlIGlmIChkYXR1bSkgY2VyciA8PCAiICAgICByZWZDb3VudCBub3cgIiA8PCAqcmVmQ291bnQg
PDwgIlxuIjsKICBlbHNlIGlmIChvcmcuZGF0dW0pIGNlcnIgPDwgIiAgICAgcmVmQ291bnQgbm93
ICIgPDwgKihvcmcucmVmQ291bnQpIDw8ICJcbiI7CgogIHJlZkNvdW50ID0gb3JnLnJlZkNvdW50
OwogIGRhdHVtID0gb3JnLmRhdHVtOwogIC8vIFRhZyBpdHNlbGYgbm90IGNvcGllZCAtLSB1bmlx
dWUgdG8gZWFjaCBpbnN0YW5jZQoKICByZXR1cm4gKnRoaXM7Cn0KCmNsYXNzIFZhckVudHJ5IHsK
cHVibGljOgogIE1vZElkIG1vZDsKICBWYXJFbnRyeSAoTW9kSWQgcCkgeyBtb2QgPSBwOyB9CiAg
VmFyRW50cnkgKCkgeyB9Cn07CgpjbGFzcyBwc2V1ZG9UVCB7CiAgTW9kSWQgbW9kOwpwdWJsaWM6
CiAgcHNldWRvVFQgKE1vZElkIHApIHsgbW9kID0gcDsgfQogIHBzZXVkb1RUICgpIHsgfQp9OwoK
VmFyRW50cnkgY29weSAoY29uc3QgVmFyRW50cnkmIHZhcikgeyByZXR1cm4gdmFyOyB9CgppbnQg
bWFpbigpCnsKICBNb2RJZCBmb28oMSk7CiAgVmFyRW50cnkgdihmb28pOwogIHBzZXVkb1RUIHZh
ciA9IHBzZXVkb1RUKGNvcHkodikubW9kKTsKfQo=
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnats/78: g++ 2.95.2 copies without constructor, then calls destructor,
pmorris <=