dig*_*evo 5 c++ arrays static-code-analysis unsigned-integer pvs-studio
我知道无符号整数是臭名昭著的,C++ 开发人员通常会避免使用无符号整数。我有一个包含两个int不应包含负值的成员变量的类:
.
.
.
private:
int m_Y_AxisLen;
int m_X_AxisLen;
.
.
.
Run Code Online (Sandbox Code Playgroud)
我以防止输入任何负数的方式设计了成员函数的逻辑。所以我确保这两个成员不会被分配负值。但是当我使用PVS-Studio
时,这也会带来一些警告。例如这里:
for ( int row = 0; row < getY_AxisLen( ); ++row )
{
for ( int column = 0; column < getX_AxisLen( ) - 1; ++column )
{
if ( m_characterMatrix[ row ][ column ] == getFillCharacter( ) )
{
m_characterMatrix[ row ][ column ] = fillCharacter;
}
}
}
Run Code Online (Sandbox Code Playgroud)
PVS-Studio 责怪我的索引row和类型column不正确memsize。这可能意味着我应该使用std::size_t row和std::size_t column?
但如果我这样做了,那么它仍然会抱怨并说将无符号整数类型与getY_AxisLen( )(返回一个int)进行比较是危险的。
所以这就是我想重写部分类以切换到此的原因:
private:
uint32_t m_Y_AxisLen;
uint32_t m_X_AxisLen;
Run Code Online (Sandbox Code Playgroud)
我虚心向以前处理过此类问题的专业人士寻求见解和建议。当谈到这些问题时,你会采取什么方法?
很多“你不应该使用无符号整数”基本上只是害怕你会混淆有符号整数和无符号整数,导致环绕,或者避免复杂的整数提升规则。
但在您的代码中,我认为没有理由不使用uint32_tand std::size_t,因为m_X_AxisLenandm_Y_AxisLen不应包含负值,并且使用uint32_tandstd::size_t在这里更有意义:
因此,我建议更改m_X_AxisLen并m_Y_AxisLen:
std::size_t m_Y_AxisLen;
std::size_t m_X_AxisLen; // for consistency
Run Code Online (Sandbox Code Playgroud)
改变row和column
std::size_t row = 0;
// and
std::size_t column = 0;
Run Code Online (Sandbox Code Playgroud)
使getX_AxisLen( )退货成为std::size_t
并进行for循环:
for ( int column = 0; column < getX_AxisLen( ) - 1; ++column )
Run Code Online (Sandbox Code Playgroud)
到:
for ( int column = 0; column + 1 < getX_AxisLen( ); ++column )
Run Code Online (Sandbox Code Playgroud)
因为如果getX_AxisLen()返回0,getX_AxisLen( ) - 1将导致环绕。
基本上,使用有意义的东西。如果值不能为负数,请使用unsigned类型。
| 归档时间: |
|
| 查看次数: |
735 次 |
| 最近记录: |