From: Date: November 17 2005 11:27pm Subject: Query class derived from std::ostream constructor issue List-Archive: http://lists.mysql.com/plusplus/5161 Message-Id: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="_===3816416====style.net===_" --_===3816416====style.net===_ Content-Type: text/plain; charset="ISO-8859-1"; format="flowed" Content-Transfer-Encoding: 8bit Hi, I've noticed a serious bug that was introduced in MySQL++ v2.0.0 when the Query class was changed to derive from std::ostream. Per the C++ standard, regardless of the order of statements in a constructor's initialization list, base classes are initialized before the members of the current class are. === So in query.h:188: Query(Connection* c, bool te = true) : std::ostream(&sbuffer_), OptionalExceptions(te), Lockable(false), def(this), conn_(c), success_(false) { success_ = true; } ... line: 694 /// \brief String buffer for storing assembled query std::stringbuf sbuffer_; === The std::stringbuf “sbuffer_” is not yet initialized when it is passed into the std::ostream constructor. If you build with g++, you can get away with this (not sure if it leads to any memory corruption), but with Sun Studio 11 compilers (and other compilers), for example, you will incur a memory access fault. The simple solution is to make the sbuffer_ member a pointer and allocate it in Connection::query() passing the newly created object as a parameter to the Query() constructor and clean it up in Query’s destructor. I’ve attached an example of the changes. /kristofer --_===3816416====style.net===_ Content-Type: text/plain Content-Disposition: attachment; filename="connection.cpp.diff.txt" Content-Transfer-Encoding: base64 LS0tIC4uLy4uLy4uL215c3FsKystMi4wLjYvbGliL2Nvbm5lY3Rpb24uY3BwCU1vbiBTZXAg MjYgMTA6MjE6NDkgMjAwNQorKysgY29ubmVjdGlvbi5jcHAJVGh1IE5vdiAxNyAxMzozNjo1 NyAyMDA1CkBAIC0yMDAsNyArMjAwLDggQEAKIGJvb2wKIENvbm5lY3Rpb246OmNyZWF0ZV9k Yihjb25zdCBzdGQ6OnN0cmluZyYgZGIpCiB7Ci0JUXVlcnkgcSh0aGlzLCB0aHJvd19leGNl cHRpb25zKCkpOworCXN0ZDo6c3RyaW5nYnVmICpzYiA9IG5ldyBzdGQ6OnN0cmluZ2J1ZjsK KwlRdWVyeSBxKHRoaXMsIHNiLCB0aHJvd19leGNlcHRpb25zKCkpOwogCXJldHVybiBxLmV4 ZWMoIkNSRUFURSBEQVRBQkFTRSAiICsgZGIpOwogfQogCkBAIC0yMDgsNyArMjA5LDggQEAK IGJvb2wKIENvbm5lY3Rpb246OmRyb3BfZGIoY29uc3Qgc3RkOjpzdHJpbmcmIGRiKQogewot CVF1ZXJ5IHEodGhpcywgdGhyb3dfZXhjZXB0aW9ucygpKTsKKwlzdGQ6OnN0cmluZ2J1ZiAq c2IgPSBuZXcgc3RkOjpzdHJpbmdidWY7CisJUXVlcnkgcSh0aGlzLCBzYiwgdGhyb3dfZXhj ZXB0aW9ucygpKTsKIAlyZXR1cm4gcS5leGVjKCJEUk9QIERBVEFCQVNFICIgKyBkYik7CiB9 CiAKQEAgLTI3Miw3ICsyNzQsOCBAQAogUXVlcnkKIENvbm5lY3Rpb246OnF1ZXJ5KCkKIHsK LQlyZXR1cm4gUXVlcnkodGhpcywgdGhyb3dfZXhjZXB0aW9ucygpKTsKKwlzdGQ6OnN0cmlu Z2J1ZiAqc2IgPSBuZXcgc3RkOjpzdHJpbmdidWY7CisJcmV0dXJuIFF1ZXJ5KHRoaXMsIHNi LCB0aHJvd19leGNlcHRpb25zKCkpOwogfQogCiAK --_===3816416====style.net===_ Content-Type: text/plain Content-Disposition: attachment; filename="query.cpp.diff.txt" Content-Transfer-Encoding: base64 LS0tIC4uLy4uLy4uL215c3FsKystMi4wLjYvbGliL3F1ZXJ5LmNwcAlNb24gU2VwIDI2IDEw OjIxOjQ5IDIwMDUKKysrIHF1ZXJ5LmNwcAlUaHUgTm92IDE3IDEzOjMyOjMyIDIwMDUKQEAg LTMxLDcgKzMxLDcgQEAKIG5hbWVzcGFjZSBteXNxbHBwIHsKIAogUXVlcnk6OlF1ZXJ5KGNv bnN0IFF1ZXJ5JiBxKSA6Ci1zdGQ6Om9zdHJlYW0oJnNidWZmZXJfKSwJCitzdGQ6Om9zdHJl YW0oc2J1ZmZlcl8pLAogT3B0aW9uYWxFeGNlcHRpb25zKHEuZXhjZXB0aW9ucygpKSwKIExv Y2thYmxlKHEubG9ja2VkKCkpLAogZGVmKHEuZGVmKSwKQEAgLTI5MSw5ICsyOTEsOSBAQAog Y2hhciogUXVlcnk6OnByZXZpZXdfY2hhcigpCiB7CiAJKnRoaXMgPDwgc3RkOjplbmRzOwot CXNpemVfdCBsZW5ndGggPSBzYnVmZmVyXy5zdHIoKS5zaXplKCk7CisJc2l6ZV90IGxlbmd0 aCA9IHNidWZmZXJfLT5zdHIoKS5zaXplKCk7CiAJY2hhciogcyA9IG5ldyBjaGFyW2xlbmd0 aCArIDFdOwotCXN0cmNweShzLCBzYnVmZmVyXy5zdHIoKS5jX3N0cigpKTsKKwlzdHJjcHko cywgc2J1ZmZlcl8tPnN0cigpLmNfc3RyKCkpOwogCXJldHVybiBzOwogfQogCkBAIC0zMDAs NyArMzAwLDcgQEAKIAogdm9pZCBRdWVyeTo6cHJvYyhTUUxRdWVyeVBhcm1zJiBwKQogewot CXNidWZmZXJfLnN0cigiIik7CisJc2J1ZmZlcl8tPnN0cigiIik7CiAKIAljaGFyIG51bTsK IAlTUUxTdHJpbmcqIHNzOwpAQCAtMzMzLDcgKzMzMyw3IEBACiB7CiAJc2Vla3AoMCk7CiAJ Y2xlYXIoKTsKLQlzYnVmZmVyXy5zdHIoIiIpOworCXNidWZmZXJfLT5zdHIoIiIpOwogCiAJ cGFyc2VfZWxlbXNfLmNsZWFyKCk7CiAJZGVmLmNsZWFyKCk7CkBAIC00NTIsNyArNDUyLDcg QEAKIAogCSp0aGlzIDw8IHN0ZDo6ZW5kczsKIAotCXJldHVybiBzYnVmZmVyXy5zdHIoKTsK KwlyZXR1cm4gc2J1ZmZlcl8tPnN0cigpOwogfQogCiAK --_===3816416====style.net===_ Content-Type: text/plain Content-Disposition: attachment; filename="query.h.diff.txt" Content-Transfer-Encoding: base64 LS0tIC4uLy4uLy4uL215c3FsKystMi4wLjYvbGliL3F1ZXJ5LmgJVGh1IE5vdiAxNyAxNzox Mzo1MSAyMDA1CisrKyBxdWVyeS5oCVRodSBOb3YgMTcgMTc6MTQ6MDggMjAwNQpAQCAtMTg1 LDE3ICsxODUsMjMgQEAKIAkvLy8KIAkvLy8gXHBhcmFtIGMgY29ubmVjdGlvbiB0aGUgZmlu aXNoZWQgcXVlcnkgc2hvdWxkIGJlIHNlbnQgb3V0IG9uCiAJLy8vIFxwYXJhbSB0ZSBpZiB0 cnVlLCB0aHJvdyBleGNlcHRpb25zIG9uIGVycm9ycwotCVF1ZXJ5KENvbm5lY3Rpb24qIGMs IGJvb2wgdGUgPSB0cnVlKSA6Ci0Jc3RkOjpvc3RyZWFtKCZzYnVmZmVyXyksCisJUXVlcnko Q29ubmVjdGlvbiogYywgc3RkOjpzdHJpbmdidWYgKnNiLCBib29sIHRlID0gdHJ1ZSkgOgor CXN0ZDo6b3N0cmVhbShzYiksCiAJT3B0aW9uYWxFeGNlcHRpb25zKHRlKSwKIAlMb2NrYWJs ZShmYWxzZSksCiAJZGVmKHRoaXMpLAogCWNvbm5fKGMpLAotCXN1Y2Nlc3NfKGZhbHNlKQor CXN1Y2Nlc3NfKGZhbHNlKSwKKwlzYnVmZmVyXyhzYikKIAl7CiAJCXN1Y2Nlc3NfID0gdHJ1 ZTsKIAl9CiAKKwl+UXVlcnkoKQorCXsKKwkJZGVsZXRlIHNidWZmZXJfOworCX0KKwogCS8v LyBcYnJpZWYgQ3JlYXRlIGEgbmV3IHF1ZXJ5IG9iamVjdCBhcyBhIGNvcHkgb2YgYW5vdGhl ci4KIAkvLy8KIAkvLy8gVGhpcyBpcyBcYiBub3QgYSB0cmFkaXRpb25hbCBjb3B5IGN0b3Ih ICBJdHMgb25seSBwdXJwb3NlIGlzIHRvCkBAIC02OTIsNyArNjk4LDcgQEAKIAlzdGQ6Om1h cDxzdGQ6OnN0cmluZywgc2hvcnQgaW50PiBwYXJzZWRfbnVtc187CiAKIAkvLy8gXGJyaWVm IFN0cmluZyBidWZmZXIgZm9yIHN0b3JpbmcgYXNzZW1ibGVkIHF1ZXJ5Ci0Jc3RkOjpzdHJp bmdidWYgc2J1ZmZlcl87CisJc3RkOjpzdHJpbmdidWYgKnNidWZmZXJfOwogCiAJLy8vLyBJ bnRlcm5hbCBzdXBwb3J0IGZ1bmN0aW9ucwogCW15X3Vsb25nbG9uZyBhZmZlY3RlZF9yb3dz KCkgY29uc3Q7Cg== --_===3816416====style.net===_--