2012-01-16 121 views
2

我使用Visual Studio 2010编译了一个代码,然后试图运行它,不幸在测试期间有时出现错误“Debug Assertion Failed!”.... Expression(unsingned)( c + 1)< = 256Visual C++“Debug Assertion Failed”

然后我尝试了相同的情况,但使用gcc,它运行没有任何问题。任何想法如何关于这个问题?

+0

可以是任何东西 - 实际的代码将有助于确定问题。 – sharptooth 2012-01-16 08:41:44

+0

当你得到一个调试断言时,你通常可以选择进入调试器。如果你这样做,你可能会看到问题所在。 – 2012-01-16 08:43:35

回答

3

有一段代码说:“在这一点上,我们希望表达式(unsigned)(c + 1) <= 256为真;如果不是,请停止执行,并进入调试器”。

闯入调试器的方法依赖于平台,可能对gcc没有正确实现。我会在项目中寻找这段代码,然后尝试找出为什么c应该小于或等于255,并且是什么使它超出范围;让程序运行到断言被触发的地方,为错误条件提供了一个隐含的断点,从此开始。

+0

非常感谢...你的解释是有道理的..但是让我感到困惑的是,我正在研究一个只有字符0-255的文本文件..为什么不同样的文件产生问题用gcc? – 2012-01-17 06:32:53

+0

可能存在问题,但您没有看到它,因为测试已禁用。 – 2012-01-17 09:23:57

4

您正在调用函数,如isalpha()或isdigit(),其值不是单个字节0-255的整数。

+0

谢谢大家。我发现我使用了一个函数,如带有Unicode字符的isalpha。 – 2012-07-24 21:02:39

2

我发现问题的原因是每个编译器如何声明字符。在Visual Studio中,缺省值是Signed char。所以每个字符都被签名,除非你明确地在它的声明前面加上无符号的单词。所以在VS中,字符的范围是-128到127,如果读取的字符的ASCII大于128,它将在VS中具有负码。由于这种情况在函数isalpha,isdigit等中没有处理,所以函数将失败。 在gcc中,将char设置为签名或未签名的方法类似于动态预处理器。

1

对于意外输入的<ctype.h>函数,您已经成为未定义行为的受害者。根据section 7.4, paragraph 1 of the C11 standard

在所有情况下的参数为int,它的值应是可表示为unsigned char或应等于宏EOF的值。如果参数有任何其他值,则行为是未定义的。

换句话说,如果x是不是在[0..UCHAR_MAX]EOF的范围内,则必须不将其传递给任何的<ctype.h>功能。被抛出的断言是一种相当有礼貌的方式,让你知道你违反了这条规则;大部分只会让可怕的事情发生(例如,我可以想象heartbleedish缺陷)。

相关问题