1.介绍

经常进行代码测试和静态代码分析的同学,应该会遇到这样的一个问题,就是一个程序段的最后几行,或者一个源文件末尾会出现错误。本文,结合专业的静态代码分析软件PSV-Studio提供错误类型代码库,分析总结为最后几行错误模式,并对此类问题进行示例展示。

2.最后几行的影响

我们在实际编程过程中,经常需要重复编写相似的代码部件或代码段,长时间进行这样类似工作是极其无聊乏味的,所以,我们必不可免要进行复制--粘贴,我们将这类代码片段或函数称为“复制--粘贴”元素。每个人都可能意识到这样会出现问题:伴随着复制粘贴的大量操作,可能会忽略修改一些变化项,从而造成错误。下面,我先给出一个简短的代码示例:

inline Vector3int43& operator+=(const Vector3int32& other)
{
x += other.x;
y += other.y;
z += other.y;
return *this;
}

显而易见,行“z += other.y”出现错误,这里程序员忘记将‘y’换成‘z’。

你可能认为这仅仅是示例代码,不具有代表性,那么本文从PSV-Studio提供错误类型代码库中,挑选一系列具有代表性的错误代码进行展示。

3.重要软件应用或框架源码示例

Source Engine SDK

inline void Init( float ix=0, float iy=0,
float iz=0, float iw = 0 )
{
SetX( ix );
SetY( iy );
SetZ( iz );
SetZ( iw );
}

上面代码中,最后一行应该调用SetW()

Chromium

if (access & FILE_WRITE_ATTRIBUTES)
output.append(ASCIIToUTF16("\tFILE_WRITE_ATTRIBUTES\n"));
if (access & FILE_WRITE_DATA)
output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n"));
if (access & FILE_WRITE_EA)
output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
if (access & FILE_WRITE_EA)
output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
break;

最后的三个条件判断重复。

ReactOS

if (*ScanString == L'\"' ||
*ScanString == L'^' ||
*ScanString == L'\"')

错误显而易见。

Multi Theft Auto

class CWaterPolySAInterface
{
public:
WORD m_wVertexIDs[3];
};
CWaterPoly* CWaterManagerSA::CreateQuad (....)
{
....
pInterface->m_wVertexIDs [ 0 ] = pV1->GetID ();
pInterface->m_wVertexIDs [ 1 ] = pV2->GetID ();
pInterface->m_wVertexIDs [ 2 ] = pV3->GetID ();
pInterface->m_wVertexIDs [ 3 ] = pV4->GetID ();
....
}

最后一行代码是冗余的,因为数组只有3个元素。

Source Engine SDK

intens.x=OrSIMD(AndSIMD(BackgroundColor.x,no_hit_mask),
AndNotSIMD(no_hit_mask,intens.x));
intens.y=OrSIMD(AndSIMD(BackgroundColor.y,no_hit_mask),
AndNotSIMD(no_hit_mask,intens.y));
intens.z=OrSIMD(AndSIMD(BackgroundColor.y,no_hit_mask),
AndNotSIMD(no_hit_mask,intens.z));

在最后,忘记将BackgroundColor.y替换为 BackGroundColor.z

Trans-Proteomic Pipeline

void setPepMaxProb(....)
{
....
double max4 = 0.0;
double max5 = 0.0;
double max6 = 0.0;
double max7 = 0.0;
....
if ( pep3 ) { ... if ( use_joint_probs && prob > max3 ) ... }
....
if ( pep4 ) { ... if ( use_joint_probs && prob > max4 ) ... }
....
if ( pep5 ) { ... if ( use_joint_probs && prob > max5 ) ... }
....
if ( pep6 ) { ... if ( use_joint_probs && prob > max6 ) ... }
....
if ( pep7 ) { ... if ( use_joint_probs && prob > max6 ) ... }
....
}

程序员忘记将 prob->max6替换为 prob->max7

SeqAn

inline typename Value<Pipe>::Type const & operator*() {
tmp.i1 = *in.in1;
tmp.i2 = *in.in2;
tmp.i3 = *in.in2;
return tmp;
}

Qt

if (repetition == QStringLiteral("repeat") ||
repetition.isEmpty()) {
pattern->patternRepeatX = true;
pattern->patternRepeatY = true;
} else if (repetition == QStringLiteral("repeat-x")) {
pattern->patternRepeatX = true;
} else if (repetition == QStringLiteral("repeat-y")) {
pattern->patternRepeatY = true;
} else if (repetition == QStringLiteral("no-repeat")) {
pattern->patternRepeatY = false;
pattern->patternRepeatY = false;
} else {
//TODO: exception: SYNTAX_ERR
}

patternRepeatX在最后部分丢失了,正确的代码应该是:

pattern->patternRepeatX = false;
pattern->patternRepeatY = false;

4.总结

从本文中,大家可以知道“复制--粘贴”会带来很多隐患,这是从我们人性角度来看,个人在快要完成工作的时候,极易产生放松的心态,这样反而导致错误的产生。并且,从本文示例中可知,即使是开发Qt框架和Chromium浏览器内核的高级程序员也会发生这样的问题,希望大家形成自己的错误问题示例库,进而帮助自己降低在开发中发生错误的可能。

最新文章

  1. SVN冲突
  2. 在Linux(ubuntu server)上面安装NodeJS的正确姿势
  3. php遇上iis之上传突破
  4. win7下搭建PHP环境
  5. OpenCV3编程入门笔记(5)重要章节小节及核心函数
  6. IE6 IE7下文字显示竖排的解决办法
  7. 迅影QQ视频查看v2.0 源码
  8. #添加屏蔽IP LINUX
  9. 通过新的 Azure 媒体服务资源管理器工具管理媒体工作流
  10. Python : 熟悉又陌生的字符编码(转自Python 开发者)
  11. HashMap TreeMap ConcurrentHashMap 源码
  12. Linux 容器 vs 虚拟机 —— 谁更胜一筹
  13. 转:Jmeter分布式测试
  14. 升级MySQL5.7,开发不得不注意的坑
  15. Linux记录-TCP状态以及(TIME_WAIT/CLOSE_WAIT)分析(转载)
  16. Shiro缓存(十三)
  17. as3 对于加载进来多层swf缩放操作
  18. mysql innodb引擎事务的隔离级别
  19. C / C ++ 基于梯度下降法的线性回归法(适用于机器学习)
  20. Metrics+ElasticSearch+grafana

热门文章

  1. mysql字符串拼接
  2. [LeetCode]144. Binary Tree Preorder Traversal二叉树前序遍历
  3. 通过关闭线程底层资源关闭类似synchronized及IO阻塞的情况
  4. Net/NetCore/.NET5 ORM 六大查询体系 - SqlSugar 高级篇
  5. vue项目中的路由守卫
  6. 风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击
  7. Python 日志打印之logging.config.dictConfig使用总结
  8. Spring Security OAuth2.0认证授权二:搭建资源服务
  9. WixVersionControl Wix项目版本控制
  10. C语言的类型大小