|
Boost Users : |
Subject: [Boost-users] Microsoft compiler bug: Boost 1.38 smart pointers + CLI = crash
From: Oleg Golosovskiy (ogolosovskiy_at_[hidden])
Date: 2009-03-05 05:47:41
I have added a new bug to connect.microsoft.com. I can send the sample
project if anybody needs it.
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=420897
Type Bug ID 420897
Status Active Access Restriction Public
Opened By OlegGL Blocking Issue No
Opened 3/5/2009 Submission Language English
------------------------------------------------------------------------
*Description
*
The problem looks identical to one described in bug #101889.
http://connect.microsoft.com/VisualStudio/feedback/Workaround.aspx?FeedbackID=101889
There is only one difference - intrusive_ptr instead of shared_ptr
originally reported in #101889
The code bellow causes assertion:
boost::intrusive_ptr<test_ptr> ptr;
if(ptr)
assert(false); //MUST NOT HAPPEN BUT IT DOES!
Reproduced on VS2005 SP1 and VS2008 SP1 (Windows XP SP2)
Boost 1.38
To reproduce the problem, the Boost (booost/smart_ptr.hpp in our case)
shall be included in the CLI-compiled file under #pragma managed
(push,off) (see the code below)
If changed to "#pragma managed (push,on)", then everything is fine
Product Language
English
Version
Visual Studio 2008 SP1
Operating System
Windows XP Professional
Operating System Language
English
*How to reproduce:
*Create any native win32 C++ project, for example a console based.
int _tmain(int argc, _TCHAR* argv[])
{
do_test();
return 0;
}
1) Install and compile BOOST 1.38
2) Add a new CPP file to the project.
This file has a minimal intrusive pointer "environment" and a code
check. The Code is below.
3) Set /clr option for that particular file (Common Language Runtime
Support in the Options)
4) build the project
#include "stdafx.h"
#include "test3_dll.h"
#pragma managed (push,off)
#include "boost/smart_ptr.hpp"
class intrusive_ptr_base1
{
friend void intrusive_ptr_add_ref(intrusive_ptr_base1*);
friend void intrusive_ptr_release(intrusive_ptr_base1*);
size_t m_ref_counter;
void add_ref()
{ ++m_ref_counter; }
void release()
{ if (--m_ref_counter == 0) delete this; }
protected:
intrusive_ptr_base1() : m_ref_counter(0) {}
virtual ~intrusive_ptr_base1() {}
intrusive_ptr_base1(intrusive_ptr_base1 const &) :m_ref_counter(0) {}
intrusive_ptr_base1 &operator=(intrusive_ptr_base1 const &) {
return *this; }
};
inline void intrusive_ptr_add_ref(intrusive_ptr_base1* e)
{ e->add_ref(); }
inline void intrusive_ptr_release(intrusive_ptr_base1* e)
{ e->release(); }
class test_ptr : public intrusive_ptr_base1
{
};
#pragma managed (pop)
void do_test()
{
boost::intrusive_ptr<test_ptr> ptr;
if(ptr)
assert(false);
}
Actual Results
if(ptr) returns true for the empty ptr!
Expected Results
if(ptr) must return false for the empty ptr
TAP Code (if applicable)
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net