Hi,
i heard a lot about "undefined behaviour" in this and other newsgroups
dealing with c/c++.
Is there a list where all cases with undefined behaviour in C++ are listed?
regards marbac 48 3082
"marbac" <ma****@chello. at> wrote in message
news:qh******** **********@news .chello.at... Hi,
i heard a lot about "undefined behaviour" in this and other newsgroups dealing with c/c++.
Is there a list where all cases with undefined behaviour in C++ are
listed?
I don't know of any compiled as a list.
But read the Holy Standard, it speaks a lot about undefined behaviors.
-Sharad
"marbac" <ma****@chello. at> wrote in message
news:qh******** **********@news .chello.at... Hi,
i heard a lot about "undefined behaviour" in this and other newsgroups dealing with c/c++.
Is there a list where all cases with undefined behaviour in C++ are
listed? regards marbac
It's called the C++ standard, and its several hundred pages long.
Off the top of my head here are a few common causes of undefined behaviour
1) dereferencing a null pointer
2) accessing outside the bounds of an array
3) deleting the same memory twice
4) dereferencing a pointer after it has been deleted
5) dereferencing a pointer which points to a destroyed object
6) accessing an uninitialised variable
7) signed integer overflow
8) modifying a const object
No doubt I've missed many others
As you can see several of the common causes of undefined behaviour involve
pointers. So the moral is don't use pointers, prefer STL classes instead,
they are somewhat safer.
john
"John Harrison" <jo************ *@hotmail.com> wrote in message
news:2l******** ****@uni-berlin.de... "marbac" <ma****@chello. at> wrote in message news:qh******** **********@news .chello.at... Hi,
i heard a lot about "undefined behaviour" in this and other newsgroups dealing with c/c++.
Is there a list where all cases with undefined behaviour in C++ are listed? regards marbac
It's called the C++ standard, and its several hundred pages long.
Off the top of my head here are a few common causes of undefined behaviour
1) dereferencing a null pointer 2) accessing outside the bounds of an array 3) deleting the same memory twice 4) dereferencing a pointer after it has been deleted 5) dereferencing a pointer which points to a destroyed object 6) accessing an uninitialised variable 7) signed integer overflow 8) modifying a const object
Some more strike me -
1) main returning void
2) Copying a pointer after it has been deleted
3) Using mismatched forms of new/delete for arrays
4) Modifying a string literal
5) Changing a variable twice without a sequence point
6) Instantiating an STL container with auto_ptr
7) Adding declarations/definitions to std namespace
8) Playing around with reinterpret_cas t
many more...
-Sharad
"John Harrison" <jo************ *@hotmail.com> wrote in message
news:2l******** ****@uni-berlin.de... "marbac" <ma****@chello. at> wrote in message news:qh******** **********@news .chello.at... Is there a list where all cases with undefined behaviour in C++ are listed?
.... Off the top of my head here are a few common causes of undefined behaviour
.... 1) dereferencing a null pointer
or any pointer to an address that has not been properly obtained ( i.e.
*(int*)454 = 0; ) 2) accessing outside the bounds of an array 3) deleting the same memory twice
or calling delete on an object addresss that was not allocated with
new.
3b) Using delete[] to release memory allocated with new,
or delete on the address returned by new[]. 4) dereferencing a pointer after it has been deleted 5) dereferencing a pointer which points to a destroyed object 6) accessing an uninitialised variable
or a variable that has been destroyed.
(NB: this also applies to global variables). 7) signed integer overflow 8) modifying a const object
Two important additions I can think of:
9) modifying a variable twice between sequence points (or accessing the
value being modified).
e.g. a = ++i + ++i; or a = i + ++i;
10) deleting a derived class through a pointer to a base class whose
destructor is not virtual.
Off the top of my head too, I think that these would be the most common
causes, but I'm sure the list can be extended.
Furthermore, UB may be triggered by causing library functions
to perform one of the above actions, for example by passing an
insufficiently large or invalid output buffer to functions such as sprintf
or strcpy.
Some standard library functions have explicit restrictions on the parameters
they
can receive (e.g. calling memcpy with overlapping memory ranges).
So it is important, for writing correct code, to understand the behavior
and restrictions of the functions you are calling. And it's not an obvious
thing.
No doubt I've missed many others
So do I...
The each of the C and C++ standards use the term "Undefined behavior"
close to 200 times, and an exaustive list is impossible to provide.
As you can see several of the common causes of undefined behaviour involve pointers. So the moral is don't use pointers, prefer STL classes instead, they are somewhat safer.
Overall, the C++ standard library does a better job than C's at trying to
prevent UB. What helps even more is if you are using an STL implementation
that
supports a 'debug' mode where all container iterators are checked at
runtime.
Some caveats I can think of include:
- initializing an std::string will a NULL char pointer.
- using [..] on standard containers (i.e. vector) does not verify range.
( vector::at() may be used instead, and will throw an exception ).
That's just adding my two cents, obviously my list is also partial and
incomplete...
Ivan
-- http://ivan.vecerina.com/contact/?subject=NG_POST <- e-mail contact form
"Ivan Vecerina" <NO************ *************** *******@vecerin a.com> skrev i
en meddelelse news:cd******** **@newshispeed. ch...
[snip] Some caveats I can think of include: - initializing an std::string will a NULL char pointer. - using [..] on standard containers (i.e. vector) does not verify range. ( vector::at() may be used instead, and will throw an exception ).
To be pedantic, nothing prevents vector::operato r[] to be implemented as
vector::at. At least this is how I read the standard.
No doubt most libraries will not do so for performance reasons, of course.
/Peter
That's just adding my two cents, obviously my list is also partial and incomplete... Ivan -- http://ivan.vecerina.com/contact/?subject=NG_POST <- e-mail contact form
Sharad Kala wrote: "John Harrison" <jo************ *@hotmail.com> wrote in message news:2l******** ****@uni-berlin.de... "marbac" <ma****@chello. at> wrote in message news:qh******** **********@news .chello.at... > Hi, > > i heard a lot about "undefined behaviour" in this and other > newsgroups dealing with c/c++. > > Is there a list where all cases with undefined behaviour in C++ are listed? > > regards marbac
It's called the C++ standard, and its several hundred pages long.
Off the top of my head here are a few common causes of undefined behaviour
1) dereferencing a null pointer 2) accessing outside the bounds of an array 3) deleting the same memory twice 4) dereferencing a pointer after it has been deleted 5) dereferencing a pointer which points to a destroyed object 6) accessing an uninitialised variable 7) signed integer overflow 8) modifying a const object
Some more strike me - 1) main returning void 2) Copying a pointer after it has been deleted
You could just combine a lot of the pointer stuff to:
Using the value of a pointer that doesn't point to a valid object.
3) Using mismatched forms of new/delete for arrays 4) Modifying a string literal 5) Changing a variable twice without a sequence point
Or changing and reading it
6) Instantiating an STL container with auto_ptr 7) Adding declarations/definitions to std namespace 8) Playing around with reinterpret_cas t
many more...
1) Dividing by zero
2) Pointer arithmetic that crosses array bounds
3) Returning a reference or pointer to a local variable
4) Writing to a member of a union and then reading another one
5) Deleting a derived class object though a pointer to a base class that
has no virtual destructor
7) Using offsetof on a non-POD class/struct
8) Using a map/set with a comparison function with no strict/weak
ordering for the key type
9) Accessing vector members that don't exist
10)Using a container iterator after it has become invalid
On Tue, 13 Jul 2004 14:11:18 +0200, "Peter Koch Larsen"
<pk*****@mailme .dk> wrote: "Ivan Vecerina" <NO************ *************** *******@vecerin a.com> skrev i en meddelelse news:cd******** **@newshispeed. ch...
[snip]
Some caveats I can think of include: - initializing an std::string will a NULL char pointer. - using [..] on standard containers (i.e. vector) does not verify range. ( vector::at() may be used instead, and will throw an exception ).
To be pedantic, nothing prevents vector::operato r[] to be implemented as vector::at. At least this is how I read the standard. No doubt most libraries will not do so for performance reasons, of course.
I wouldn't like a library that implemented operator[] as at. I don't
want exceptions from undefined behaviour, since the throwing context
is lost.
IMHO, any decent operator[] should at the very least have an assert in
it.
Tom
"marbac" <ma****@chello. at> wrote in message
news:qh******** **********@news .chello.at... Hi,
i heard a lot about "undefined behaviour" in this and other newsgroups dealing with c/c++.
Is there a list where all cases with undefined behaviour in C++ are
listed? regards marbac
I don't think it's really possible to compile a list. Think about it this
way: everything you could possibly do wrong that your compiler won't catch
is undefined behavior. Hence, what you're asking for is really a
compilation of all errors which could possibly be made in writing code,
which, unfortunately, is unlikely to exist anywhere, and would probably be
useless to you even if it did.
>Writing to a member of a union and then reading another one
Are you sure?
Certainly it seems as though it is a logic error which could possibly result in
undefined behavior, but is it guaranteed undefined behavior?
<CODE>
union FooBar
{
int Foo;
char Bar;
};
int main()
{
FooBar fooBar;
fooBar.Foo = 32; //Write FooBar::Foo
char bar = fooBar.Bar; //Oops! Read FooBar::Bar
return 0;
}
</CODE>
This code could results in the "rewrite your harddrive and sleep with your
girlfriend" kind of undefined behavior?
For that to happen wouldn't the compiler have to keep track of the last member
written to for each instance of a union so that it would be able to recognize
mismatched reads?
Just curious. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Simon Bailey |
last post by:
In the following code at the end of the program z = 20 & y = 99.
void doit(const int* x)
{
int* nonconst;
nonconst = const_cast<int*>(x);
*nonconst = 99;
}
int main(int argc, char* argv)
|
by: Scott J. McCaughrin |
last post by:
The following program compiles fine but elicits this message from the
linker: "undefined reference to VarArray::funct" and thus fails.
It seems to behave as if the static data-member: VarArray::funct were
an extern, but it is declared in the same file (q.v.). What is the
remedy for this?
=================
|
by: Joona I Palaste |
last post by:
We all know that this:
void *p;
if (p=malloc(1)) {
free(p);
p;
}
causes undefined behaviour if malloc() succeeds. But what about this?
|
by: Nitin Bhardwaj |
last post by:
Well, i'm a relatively new into C( strictly speaking : well i'm a
student and have been doing & studying C programming for the last 4
years).....and also a regular reader of "comp.lang.c"
I don't have a copy of ANSI C89 standard,therefore i had to post this
question:
What is the difference between "unspecified" behaviour & "undefined"
behaviour of some C Code ??
|
by: Ken Turkowski |
last post by:
The construct
(void*)(((long)ptr + 3) & ~3)
worked well until now to enforce alignment of the pointer to long
boundaries. However, now VC++ warns about it, undoubtedly to help things
work on 64 bit machines, i.e. with 64 bit pointers.
In the early days of C, where there were problems with the size of int
being 16 or 32 bits, the response was that an int was guaranteed to hold
a pointer (yes, there were 64Kb address spaces at one time!)....
| |
by: RoSsIaCrIiLoIA |
last post by:
On Mon, 07 Feb 2005 21:28:30 GMT, Keith Thompson <kst-u@mib.org>
wrote:
>"Romeo Colacitti" <wwromeo@gmail.com> writes:
>> Chris Torek wrote:
>>> In article <4205BD5C.6DC8@mindspring.com>
>>> pete <pfiland@mindspring.com> wrote:
>
>>> >If you have
>>> > int array;
>>> >then
|
by: Frederick Gotham |
last post by:
I have a general idea of the different kinds of behaviour described by the
C Standard, such as:
(1) Well-defined behaviour:
int a = 2, b = 3;
int c = a + b;
(Jist: The code will work perfectly.)
|
by: Franz Hose |
last post by:
the following program, when compiled with gcc and '-std=c99', gcc says
test.c:6: error: jump into scope of identifier with
variably modified type
that is, it does not even compile.
lcc-win32, on the other hand, reports
Warning test.c: 7 unreachable code
|
by: subramanian100in |
last post by:
Consider the following code:
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
const double& ref = 100;
|
by: coolguyaroundyou |
last post by:
Will the following statement invoke undefined behavior :
a^=b,b^=a,a^=b ;
given that a and b are of int-type ??
Be cautious, I have not written a^=b^=a^=b ; which, of course, is
undefined. I am having some confusion with the former statement!
Also, state the reason for the statement being undefined!
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...
| |
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++-12 -std=c++20 -Wnarrowing bit_field.cpp
Here is the code in...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own....
Now, this would greatly impact the work of software developers. The idea...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms.
Adolph will...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
| |
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
|
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |