consider following example:
// someLibrary.h which is exported.
struct HandlePrivate;
typedef HandlePrivate& Handle;
Handle getHandle(int code);
void closeHandle(Handle handle);
// someLibrary.cpp
#include "someLibrary.h"
struct HandlePrivate{};//definition of HandlePrivate;
Handle getHandle(int code)
{
static HandlePrivate instance;
return code >= 0
? instance
: ( *(HandlePrivate*)0); // Hack, I know it's UB.
}
Now, other programmer uses this library:
// userSource.cpp
#include "someLibrary.h"
void foo(int code)
{
Handle h = getHandle(code);
// some user code
closeHandle(h);
}
Question: When is may break user code (crash or something bad), if "SomeLibrary" author uses that hack (UB) ?
if user uses only Windows and Visual Studio 2010, answer is changed ?
Because, following example is not crashed !!! :
#include <functional>
#include <type_traits>
#include "someLibrary.h"
void foo(int code)
{
typedef std::reference_wrapper< std::remove_reference<Handle>::type> reference;
reference h = getHandle(code);
closeHandle(h); // is not crash, if code = -1 !!!!!!!!!!
// However, std::reference_wrapper::operator &() - uses dereference to pointer of 0. }