Software Archive
Read-only legacy content
17061 Discussions

Invalid type cast is compiled without error

Ricardo_Costa
Beginner
792 Views
Hello,

The Intel Compiler allows assigning an int* to a const int* &, which could cause unexpected behavior as in the following example:

[cpp]int* p;
const int* & r = p;    // assign to reference to a pointer to const int - this must not be allowed
const int immutable = 0;
r = &immutable;    // assign p to address of immutable through r
*p = 1;    // whoops, now 0 = 1![/cpp]

The code above compiles without errors,although the ASM generated ignores the assignment.

This potential issue may be hidden in template code, so it would be hard to detect without a compile error.

Regards,
Ricardo.
0 Kudos
7 Replies
Ricardo_Costa
Beginner
791 Views
Could someone comment on this issue? Thanks :)
0 Kudos
Yang_W_Intel
Employee
792 Views

Hi,
Thanks for reporting this issue. It should be a compiler bug. I have reported it to the compiler team for fix.
Thank you.
-Yang

0 Kudos
JenniferJ
Moderator
792 Views
Hello,
this issue is fixed. I checked with 12.1 update 8, icl emits the following error msg now:

tt.cpp(8): error: a reference of type "const int *&" (not const-qualified) cannot be initialized with a value of type "int *"


Jennifer
0 Kudos
SergeyKostrov
Valued Contributor II
792 Views

Hi,
Thanks for reporting this issue. It should be a compiler bug. I have reported it to the compiler team for

[SergeyK] C++ language specificationshave tobe checked.

fix.
Thank you.
-Yang


Here are some results for different C/C++ compilers:

MS C/C++ with VS2005: Error C2440: 'initializing' : cannot convert from 'int *' to 'const int *&'
MinGW C/C++ v3.4.2 : Error: invalid initialization of reference of type 'const int*&' from expression of type 'int*'
Borland C/C++ v5.5.1 : Successfully compiled
Turbo C/C++ v3.0.0 : Successfully compiled

It looks like specifications have changed because two legacy C/C++ compilers compiled the code.

The subjectalso raises a veryold question: Could a value of some variable declared as 'const'be modified later?

Best regards,
Sergey

0 Kudos
SergeyKostrov
Valued Contributor II
791 Views

Hi,
Thanks for reporting this issue. It should be a compiler bug. I have reported it to the compiler team

[SergeyK]After a series of tests with different C/C++ compilersIconfirm it.

for fix.
Thank you.
-Yang

I simply would like toinform that a 3rd legacy compiler, that is Visual C++ v6.0 ( from Visual Studio 98 EE SP5 ) has the same problem.

Please take a look at a screenshot:


0 Kudos
SergeyKostrov
Valued Contributor II
792 Views
...
The subjectalso raises a veryold question: Could a value of some variable declared as 'const'be
modified later?
...


Here is a Test-Case:

...
const int iN = 0;
printf( "Initial value for Variable of type < const int > is: %ld\n", iN );

for( int i = 0; i < 4; i++ )
{
printf( "New value for Variable of type < const int > is: %ld\n",
++( const_cast< int & >( iN ) ) );
}

printf( "Final value for Variable of type < const int > is: %ld\n", const_cast( int & )( iN ) );
printf( "Final value for Variable of type < int > is: %ld\n", iN );
...

Output:

Initial value for Variable of type < const int > is: 0

New value for Variable of type < const int >is: 1
New value for Variable of type < const int >is: 2
New value for Variable of type < const int >is: 3
New value for Variable of type < const int >is: 4

Final value for Variable of type < const int > is: 4
Final value for Variable of type < int > is: 0

0 Kudos
Ricardo_Costa
Beginner
792 Views
The subjectalso raises a veryold question: Could a value of some variable declared as 'const'be modified later?

Best regards,
Sergey


The constness is supposed to be a compile-time helper against programming errors, but the programmer still has the ultimate decision about how the variable shall be used.When const_cast is used, the programmer is explicitly telling the compiler "I know what I'm doing, don't complain", so it's allowed to modify a const variable in that case.

However the error that I reported initially is not like an explicit const cast, instead it may be hidden by template transformations that end up generating incorrect/invalid code against the programmer's will, thus the importance of detecting that situation with a compile error.

0 Kudos
Reply