From: NoName on
Lesson 1, Identified 4 weaknesses.

Lesson 2, Identifies 16 weaknesses.

(Think positive: at least the compiler, compiles, and the linker, links,
which cannot be said for competing products of competitors.)

See comments or see website for code/zips:

http://members.home.nl/hbthouppermans/VS2008Analysis/Index.htm

// *** Begin of Main.cpp ***

#include <stdio.h>

typedef char int8;
typedef short int int16;
typedef int int32;
typedef long long int64;

typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
typedef unsigned long long uint64;

/*

12 april 2008

Back to School:

Lesson 2, Integer Range Checking.

Conclusions:

Underflow for int8 not detected, BAD
Overflow for int8 not detected, BAD

Underflow for uint8 not detected, BAD
Overflow for uint8 not detected, BAD

Underflow for int16 not detected, BAD
Overflow for int16 not detected, BAD

Underflow for uint16 not detected, BAD
Overflow for uint16 not detected, BAD

Underflow for int32 not detected, BAD
Overflow for int32 not detected, BAD

Underflow for uint32 not detected, BAD
Overflow for uint32 not detected, BAD

Underflow for int64 not detected, BAD
Overflow for int64 not detected, BAD

Underflow for uint64 not detected, BAD
Overflow for uint64 not detected, BAD

16 out of 16 tests failed.

Score: 0 out of 10

*/

int main()
{
printf("Program Started \n\n");

int8 vMinInt8;
int8 vMaxInt8;

uint8 vMinUint8;
uint8 vMaxUint8;

int16 vMinInt16;
int16 vMaxInt16;

uint16 vMinUint16;
uint16 vMaxUint16;

int32 vMinInt32;
int32 vMaxInt32;

uint32 vMinUint32;
uint32 vMaxUint32;

int64 vMinInt64;
int64 vMaxInt64;

uint64 vMinUint64;
uint64 vMaxUint64;

// test int8
vMinInt8 = -128;
vMinInt8 = vMinInt8 - 1; // Underflow not detected, BAD
printf("vMinInt8: %d \n", vMinInt8 );

vMaxInt8 = 127;
vMaxInt8 = vMaxInt8 + 1; // Overflow not detected, BAD
printf("vMaxInt8: %d \n\n", vMaxInt8 );

// test uint8
vMinUint8 = 0;
vMinUint8 = vMinUint8 - 1; // Underflow not detected, BAD
printf("vMinUint8: %u \n", vMinUint8 );

vMaxUint8 = 255;
vMaxUint8 = vMaxUint8 + 1; // Overflow not detected, BAD
printf("vMaxUint8: %u \n\n", vMaxUint8 );

// test int16
vMinInt16 = -32768;
vMinInt16 = vMinInt16 - 1; // Underflow not detected, BAD
printf("vMinInt16: %d \n", vMinInt16 );

vMaxInt16 = 32767;
vMaxInt16 = vMaxInt16 + 1; // Overflow not detected, BAD
printf("vMaxInt16: %d \n\n", vMaxInt16 );

// test uint16
vMinUint16 = 0;
vMinUint16 = vMinUint16 - 1; // Underflow not detected, BAD
printf("vMinUint16: %u \n", vMinUint16 );

vMaxUint16 = 65535;
vMaxUint16 = vMaxUint16 + 1; // Overflow not detected, BAD
printf("vMaxUint16: %u \n\n", vMaxUint16 );

// test int32
vMinInt32 = 2147483648; // same as -2147483648, solves warning, <-
weakness in language.
vMinInt32 = vMinInt32 - 1; // Underflow not detected, BAD
printf("vMinInt32: %d \n", vMinInt32 );

vMaxInt32 = 2147483647;
vMaxInt32 = vMaxInt32 + 1; // Overflow not detected, BAD
printf("vMaxInt32: %d \n\n", vMaxInt32 );

// test uint32
vMinUint32 = 0;
vMinUint32 = vMinUint32 - 1; // Underflow not detected, BAD
printf("vMinUint32: %u \n", vMinUint32 );

vMaxUint32 = 4294967295;
vMaxUint32 = vMaxUint32 + 1; // Overflow not detected, BAD
printf("vMaxUint32: %u \n\n", vMaxUint32 );

// test int64
vMinInt64 = 9223372036854775808; // same as -9223372036854775808, solves
warning, <- weakness in language
vMinInt64 = vMinInt64 - 1; // Underflow not detected, BAD
printf("vMinInt64: %lld \n", vMinInt64 );

vMaxInt64 = 9223372036854775807; // 9223372036854775808 would give no
warning ?!?!, BAD
vMaxInt64 = vMaxInt64 + 1; // Overflow not detected, BAD
printf("vMaxInt64: %lld \n\n", vMaxInt64 );

// test uint64
vMinUint64 = 0;
vMinUint64 = vMinUint64 - 1; // Underflow not detected, BAD
printf("vMinUint64: %llu \n", vMinUint64 );

vMaxUint64 = 18446744073709551615;
vMaxUint64 = vMaxUint64 + 1; // Overflow not detected, BAD
printf("vMaxUint64: %llu \n\n", vMaxUint64 );

printf("Program finished \n");
}

// *** End of Main.cpp ***


From: Ulrich Eckhardt on
NoName wrote:
> typedef char int8;

Check CHAR_BITS before making such claims.

> Conclusions:
>
> Underflow for int8 not detected, BAD
> Overflow for int8 not detected, BAD

Underflow or overflow of signed integers causes 'undefined behaviour', i.e.
the standard doesn't make any requirements for it. Some compilers even use
this knowledge in order to optimise code.

> vMinInt32 = 2147483648; // same as -2147483648, solves warning,
> <- weakness in language.

Ahem, you really mean that x equals -x? You should look up the meaning of
suffixes like U or L to numeric literals.


BTW: if you actually have a question, you should state that.

Uli

From: Richard Heathfield on
Ulrich Eckhardt said:

> NoName wrote:
>> typedef char int8;
>
> Check CHAR_BITS before making such claims.

Of course you mean CHAR_BIT

But what makes you think he'll listen? Even if you don't recognise the
similarity of style between this guy and "Skybuck Flying", take a look at
his article headers and then check the article headers for recent articles
by "Skybuck Flying". Look, particularly, at the Path header. Notice any
similarities?

--
Richard Heathfield <http://www.cpax.org.uk>
Email: -http://www. +rjh@
Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
"Usenet is a strange place" - dmr 29 July 1999
From: TheDevil on
If you have a fix let me know.

Otherwise stop wasting my time.


From: Ulrich Eckhardt on
Richard Heathfield wrote:
> But what makes you think he'll listen? Even if you don't recognise the
> similarity of style between this guy and "Skybuck Flying", take a look at
> his article headers and then check the article headers for recent articles
> by "Skybuck Flying".

Ah, hadn't read the previous thread.

Thank you, Richard!

Uli