c ++中最难发现的错误

exa*_*ple 26 c++ runtime-error

我很清楚,可能不会有"c ++中最难找到的错误",但我仍然对其他人可能已经/可能已经遇到的内容感兴趣.

这个问题的想法是在与朋友讨论时产生的.我们同意,通过在您提交的源代码中包含错误来破坏cpp项目必须相当简单......但我们能想到的最好的事情是使用未初始化的变量(在运行时导致随机分段错误) .我相信有更好的方法......?!

想要错误代码的特征:

  • 首映时必须看起来像有效的代码
  • 不能停止编译代码(太明显)
  • 如果可能的话,错误看起来可能只是一个错误(如果它被发现)
  • 错误必须严重到足以阻止软件运输(例如随机seg故障,代码的逻辑故障等)

尽管如此,虽然它必须引人注目,但在代码提交后不应该显而易见......好吧,你明白了.

别担心,我们的考虑纯粹是理论上的(我们不打算破坏任何项目).我们只是认为这是一个很好的思想实验与他人分享:-)

简而言之:

什么是破坏源代码的最微妙的方法,可能会在差异提交(如git)中被忽视,但最终会阻止软件的发布?

Mat*_*lia 15

经典:

#define if while
#define else
Run Code Online (Sandbox Code Playgroud)

埋在一些标题中.


干扰@ WhozCraig的评论,同时:

#define true (!!(__LINE__ % 10))
Run Code Online (Sandbox Code Playgroud)

一旦每十行true不会如此true,但编译程序的行为将保持一致......当源中的某些内容发生变化时,莫名其妙地改变.

沿着这条线:

#define for if(__LINE__ % 10) for

#define NULL (!(__LINE__ % 10))
Run Code Online (Sandbox Code Playgroud)

或者说:

#define virtual 
Run Code Online (Sandbox Code Playgroud)

这将导致严重的问题 - 但仅在使用动态调度时,这可能使其检测更成问题.


以类似的方式:

#define dynamic_cast static_cast
Run Code Online (Sandbox Code Playgroud)
// Fail early, fail often
#define throw std::abort();
Run Code Online (Sandbox Code Playgroud)


per*_*eal 15

不太明显:

if (foo =! foobar)
Run Code Online (Sandbox Code Playgroud)

我们可以添加一个技巧来摆脱编译器警告:

 if ( (i =! 3) && (j==1))
Run Code Online (Sandbox Code Playgroud)

  • @Lim,那是一个赋值,`foo =(!bar)`,即foo得到foobar强制转换为布尔值的否定值. (2认同)

Moo*_*uck 8

我曾经被搁置了一个月的大部分时间,因为在发布版本中,我们CArray(通过Microsoft作为MFC的一部分)进行排序会随机进行段错误,但调试版本很好.我们用a替换它,std::vector问题解决了.直到几个月后,有人告诉我CArray 不使用元素赋值运算符,而是使用memcpy(source).这显然会破坏任何包含非平凡赋值运算符的对象,但它是一个标准容器,所以每个人都认为它是安全的.所以,如果一个替换std::vectorCArray在几个关键的地方...

作为一个说明,微软表示现在不使用MFC容器并使用STL容器.


Fog*_*zie 5

我想说,到目前为止,对我来说最令人沮丧的事情是使用=而不是==. 例如:

while(foo = bar) {}
Run Code Online (Sandbox Code Playgroud)

代替

while(foo == bar) {}
Run Code Online (Sandbox Code Playgroud)

从本质上讲,任何导致代码无法正常运行而不是崩溃的事情都会让我头撞墙。

荣誉奖:

  • 使用错误的数学运算符- + / *
  • =与vs类似==,误认为&&&|for ||
  • 过早的优化vector<bool>(如果你们都喜欢“什么?”,请阅读此处)
  • 具有两个或多个同名类并且使用了错误的类。

  • 但是任何现代编译器都会产生有关条件赋值的警告...... (3认同)