C and C++


LANG.CAST.CSTYLE : C-style Cast

Summary

[C++ only]

One of the following cast mechanisms is used in C++ code.

Warnings of this class will not be triggered for single-argument constructor calls, even if the constructor is not marked explicit. This may change in a future release.

Properties

Class Name C-style Cast
Significance style
Mnemonic LANG.CAST.CSTYLE
Categories
AUTOSARC++14 AUTOSARC++14:A5-2-2 Traditional C-style casts shall not be used.
MisraC++2008 MisraC++2008:5-2-4 C-style casts (other than void casts) and functional notation casts (other than explicit constructor calls) shall not be used.
MisraC++2023 MisraC++2023:8.2.2 C-style casts and functional notation casts shall not be used
JSF++ JSF++:183 Every possible measure should be taken to avoid type casting.
  JSF++:185 C++ style casts (const_cast, reinterpret_cast, and static_cast) shall be used instead of the traditional C-style casts.
Availability Available for C++ only (not C).
Enabling Checks for this warning class are disabled by default, and require the unnormalized C ASTs for the project. To enable them, add the following WARNING_FILTER rule and RETAIN_UNNORMALIZED_C_AST specification to the project configuration file.
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="C-style Cast"
Note that retaining the unnormalized ASTs will increase the disk space used to store the project representation, and may make the analysis take longer.

Example

// LANG.CAST.CSTYLE.cpp

int f_c_cast(short s){
    return (int) s;              // 'C-style Cast' warning issued here: C-style cast
}

int f_functional_cast(short s){
    return int(s);               // 'C-style Cast' warning issued here: functional notation cast
}

void f_void_cast(void){
  short s = 5;                                    // ok: not a cast
  (void) f_functional_cast(s);                    // ok: C-style cast to void
}

int* f_const_cast(const int *s){
    return const_cast<int*>(s);                    // ok: C++-style cast
}

class MyBase { int a; };
class MyDerived : public MyBase {int b; };

MyBase* f_dynamic_cast(MyDerived *d){
    return dynamic_cast<MyBase*>(d);              // ok: C++-style cast
}

MyBase* f_static_cast(MyDerived *d){
    return static_cast<MyBase*>(d);               // ok: C++-style cast
}
 
MyBase* f_reinterpret_cast(int i){
    return reinterpret_cast<MyBase*>(i);          // ok: C++-style cast
}

Relevant Configuration File Parameters

The following configuration file parameters affect checks for this warning class.