您当前的位置 ->主页 > 传世指南 > >
第二次使用PVSStudio检查WinMerge
来源:http://www.44woool.bz 发表时间:2019-06-27 12:21
抽象

本文继续认为静态代分析器是经常使用的工具,而不是一次。

介绍

PVS-Studio分析器允许您检测C / C ++应用程序中的错误。我们前一段时间用它检查了WinMerge。几乎没有错误的描述可以在文章“通过五个开源项目中检测到的错误的例子比较Visual Studio 2010和PVS-Studio中的常规静态分析”[1]中找到。

从那时起一年过去了,我们决定使用新版本的PVS-Studio测试新版本的WinMerge。以下是第二次检查的结果。但最重要的是,从中可以得出以下结论:

使用静态代分析工具检查项目没有任何意义,并且对它感到满意。应定期进行分析。

原因如下:

每个新分析器的版本通常都包含新的诊断规则,这意味着您可以检测到更多错误。编写新代时,程序中会出现新错误。检测其中许多方法最便宜的方法是使用静态代分析器[2]。

让我们回到代中发现的缺陷。请注意,此处描述的许多错误不是指WinMerge项目本身,而是指它使用的库。但是,没关系。我们只想表明PVS-Studio分析仪正在快速开发并学习如何检测更多新类型的错误。下面的例子证明了这一点。

奇数代片段

片段N1

 BOOL CCrystalEditView ::DoDropText(....){...UINT cbData =(UINT):: GlobalSize(hData);UINT cchText = cbData / sizeof(TCHAR) -  1;if(cchText <0)返回FALSE;...} 

PVS-Studio的诊断规则:V547表达式'cchText <0'始终为false。无符号类型值永远不会<0。合并ccrystaleditview.cpp 1135

GlobalSize()函数在发生错误时返回值0。如果它发生,这种情况将被错误处理。代是使用无符号数据类型构建的,'cchText'变量也是'unsigned'类型。这意味着“cchText <0”条件始终为false。可以通过以下方式重写代来修复代:

 UINT cbData =(UINT):: GlobalSize(hData);if(cbData 

碎片N2

 bool isopenbrace(TCHAR c){return c == _T('{')|| c == _T('(')||?c == _T('[')|| c == _T('<');}bool isclosebrace(TCHAR c){返回c == _T('}')|| c == _T('}')||?c == _T(']')|| c == _T('>');} 

PVS-Studio的诊断规则:V501“||”的左侧和右侧有相同的子表达式运算符:c == L'}'|| c == L'}'合并ccrystaleditview.cpp 1556

在isclosebrace()函数中,'c'变量与'}'字符进行两次比较。如果检查isopenbrace()函数的代,你就会明白在第二种情况下应该将'c'变量与')'字符进行比较。

片段N3

 static HRESULT safeInvokeA(....){HRESULT h;...//将h设置为FAILEDh = -1;...} 

PVS-Studio的诊断规则:V543将值“-1”分配给HRESULT类型的变量“h”是奇怪的。合并plugins.cpp 992

将值-1分配给类型为HRESULT的变量是不正确的。

HRESULT是一个32位值,分为三个不同的字段:严重代,设备代和错误代。要处理HRESULT值,这些特定常量用作S_OK,E_FAIL,E_ABORT等,而像SUCCEEDED和FAILED这样的宏用于检查HRESULT类型的值。

写入值“-1”的方式不正确。如果要报告一些奇怪的错误,则应使用值0x80004005L(未指定的失败)。这个常量和其他类似的常量在“WinError.h”中描述。

这里可以找到类似的错误:

V543将值“-1”分配给HRESULT类型的变量“h”是奇怪的。合并plugins.cpp 1033

片段N4

 int TimeSizeCompare :: CompareFiles(....){UINT代= DIFFCODE :: SAME;...if(di.left.size!= di.right.size){code&= ~DIFFCODE :: SAME;code = DIFFCODE :: DIFF;}...} 

PVS-Studio的诊断规则:V519'code'变量连续两次赋值。也许这是一个错误。检查行:79,80。合并timesizecompare.cpp 80

这段代可能正确也不正确:因为我不熟悉WinMerge项目的结构,所以我无法确定。

变体是可能的:

代包含错误,因此第二行应如下所示:抽象

本文继续认为静态代分析器是经常使用的工具,而不是一次。

介绍

PVS-Studio分析器允许您检测C / C ++应用程序中的错误。我们前一段时间用它检查了WinMerge。几乎没有错误的描述可以在文章“通过五个开源项目中检测到的错误的例子比较Visual Studio 2010和PVS-Studio中的常规静态分析”[1]中找到。

从那时起一年过去了,我们决定使用新版本的PVS-Studio测试新版本的WinMerge。以下是第二次检查的结果。但最重要的是,从中可以得出以下结论:

使用静态代分析工具检查项目没有任何意义,并且对它感到满意。应定期进行分析。

原因如下:

每个新分析器的版本通常都包含新的诊断规则,这意味着您可以检测到更多错误。编写新代时,程序中会出现新错误。检测其中许多方法最便宜的方法是使用静态代分析器[2]。

让我们回到代中发现的缺陷。请注意,此处描述的许多错误不是指WinMerge项目本身,而是指它使用的库。但是,没关系。我们只想表明PVS-Studio分析仪正在快速开发并学习如何检测更多新类型的错误。下面的例子证明了这一点。

奇数代片段

片段N1

 BOOL CCrystalEditView ::DoDropText(....){...UINT cbData =(UINT):: GlobalSize(hData);UINT cchText = cbData / sizeof(TCHAR) -  1;if(cchText <0)返回FALSE;...} 

PVS-Studio的诊断规则:V547表达式'cchText <0'始终为false。无符号类型值永远不会<0。合并ccrystaleditview.cpp 1135

GlobalSize()函数在发生错误时返回值0。如果它发生,这种情况将被错误处理。代是使用无符号数据类型构建的,'cchText'变量也是'unsigned'类型。这意味着“cchText <0”条件始终为false。可以通过以下方式重写代来修复代:

 UINT cbData =(UINT):: GlobalSize(hData);if(cbData 

碎片N2

 bool isopenbrace(TCHAR c){return c == _T('{')|| c == _T('(')||?c == _T('[')|| c == _T('<');}bool isclosebrace(TCHAR c){返回c == _T('}')|| c == _T('}')||?c == _T(']')|| c == _T('>');} 

PVS-Studio的诊断规则:V501“||”的左侧和右侧有相同的子表达式运算符:c == L'}'|| c == L'}'合并ccrystaleditview.cpp 1556

在isclosebrace()函数中,'c'变量与'}'字符进行两次比较。如果检查isopenbrace()函数的代,你就会明白在第二种情况下应该将'c'变量与')'字符进行比较。

片段N3

 static HRESULT safeInvokeA(....){HRESULT h;...//将h设置为FAILEDh = -1;...} 

PVS-Studio的诊断规则:V543将值“-1”分配给HRESULT类型的变量“h”是奇怪的。合并plugins.cpp 992

将值-1分配给类型为HRESULT的变量是不正确的。

HRESULT是一个32位值,分为三个不同的字段:严重代,设备代和错误代。要处理HRESULT值,这些特定常量用作S_OK,E_FAIL,E_ABORT等,而像SUCCEEDED和FAILED这样的宏用于检查HRESULT类型的值。

写入值“-1”的方式不正确。如果要报告一些奇怪的错误,则应使用值0x80004005L(未指定的失败)。这个常量和其他类似的常量在“WinError.h”中描述。

这里可以找到类似的错误:

V543将值“-1”分配给HRESULT类型的变量“h”是奇怪的。合并plugins.cpp 1033

片段N4

 int TimeSizeCompare :: CompareFiles(....){UINT代= DIFFCODE :: SAME;...if(di.left.size!= di.right.size){code&= ~DIFFCODE :: SAME;code = DIFFCODE :: DIFF;}...} 

PVS-Studio的诊断规则:V519'code'变量连续两次赋值。也许这是一个错误。检查行:79,80。合并timesizecompare.cpp 80

这段代可能正确也不正确:因为我不熟悉WinMerge项目的结构,所以我无法确定。

变体是可能的:

代包含错误,因此第二行应如下所示:抽象

本文继续认为静态代分析器是经常使用的工具,而不是一次。

介绍

PVS-Studio分析器允许您检测C / C ++应用程序中的错误。我们前一段时间用它检查了WinMerge。几乎没有错误的描述可以在文章“通过五个开源项目中检测到的错误的例子比较Visual Studio 2010和PVS-Studio中的常规静态分析”[1]中找到。

从那时起一年过去了,我们决定使用新版本的PVS-Studio测试新版本的WinMerge。以下是第二次检查的结果。但最重要的是,从中可以得出以下结论:

使用静态代分析工具检查项目没有任何意义,并且对它感到满意。应定期进行分析。

原因如下:

每个新分析器的版本通常都包含新的诊断规则,这意味着您可以检测到更多错误。编写新代时,程序中会出现新错误。检测其中许多方法最便宜的方法是使用静态代分析器[2]。

让我们回到代中发现的缺陷。请注意,此处描述的许多错误不是指WinMerge项目本身,而是指它使用的库。但是,没关系。我们只想表明PVS-Studio分析仪正在快速开发并学习如何检测更多新类型的错误。下面的例子证明了这一点。

奇数代片段

片段N1

 BOOL CCrystalEditView ::DoDropText(....){...UINT cbData =(UINT):: GlobalSize(hData);UINT cchText = cbData / sizeof(TCHAR) -  1;if(cchText <0)返回FALSE;...} 

PVS-Studio的诊断规则:V547表达式'cchText <0'始终为false。无符号类型值永远不会<0。合并ccrystaleditview.cpp 1135

GlobalSize()函数在发生错误时返回值0。如果它发生,这种情况将被错误处理。代是使用无符号数据类型构建的,'cchText'变量也是'unsigned'类型。这意味着“cchText <0”条件始终为false。可以通过以下方式重写代来修复代:

 UINT cbData =(UINT):: GlobalSize(hData);if(cbData 

碎片N2

 bool isopenbrace(TCHAR c){return c == _T('{')|| c == _T('(')||?c == _T('[')|| c == _T('<');}bool isclosebrace(TCHAR c){返回c == _T('}')|| c == _T('}')||?c == _T(']')|| c == _T('>');} 

PVS-Studio的诊断规则:V501“||”的左侧和右侧有相同的子表达式运算符:c == L'}'|| c == L'}'合并ccrystaleditview.cpp 1556

在isclosebrace()函数中,'c'变量与'}'字符进行两次比较。如果检查isopenbrace()函数的代,你就会明白在第二种情况下应该将'c'变量与')'字符进行比较。

片段N3

 static HRESULT safeInvokeA(....){HRESULT h;...//将h设置为FAILEDh = -1;...} 

PVS-Studio的诊断规则:V543将值“-1”分配给HRESULT类型的变量“h”是奇怪的。合并plugins.cpp 992

将值-1分配给类型为HRESULT的变量是不正确的。

HRESULT是一个32位值,分为三个不同的字段:严重代,设备代和错误代。要处理HRESULT值,这些特定常量用作S_OK,E_FAIL,E_ABORT等,而像SUCCEEDED和FAILED这样的宏用于检查HRESULT类型的值。

写入值“-1”的方式不正确。如果要报告一些奇怪的错误,则应使用值0x80004005L(未指定的失败)。这个常量和其他类似的常量在“WinError.h”中描述。

这里可以找到类似的错误:

V543将值“-1”分配给HRESULT类型的变量“h”是奇怪的。合并plugins.cpp 1033

片段N4

 int TimeSizeCompare :: CompareFiles(....){UINT代= DIFFCODE :: SAME;...if(di.left.size!= di.right.size){code&= ~DIFFCODE :: SAME;code = DIFFCODE :: DIFF;}...} 

PVS-Studio的诊断规则:V519'code'变量连续两次赋值。也许这是一个错误。检查行:79,80。合并timesizecompare.cpp 80

这段代可能正确也不正确:因为我不熟悉WinMerge项目的结构,所以我无法确定。

变体是可能的:

代包含错误,因此第二行应如下所示:

上一篇:大会开发者本周将发布一款新的VR游戏
下一篇:Vivendi宣布了Scarface游戏

相关文章:
最近更新
热点推存
Copyright © (2019 - 2020) 四四传世 http://www.44woool.bz All Rights Reserved