标签: assert

如何在不使用abort()的情况下断言()?

如果我使用assert()并且断言失败assert()则会调用abort(),突然结束正在运行的程序.我的生产代码中负担不起.有没有办法在运行时断言但能够捕获失败的断言,所以我有机会优雅地处理它们?

c++ assert exception

24
推荐指数
4
解决办法
2万
查看次数

C#编译器如何在发布版本中删除Debug.Assert?

我最近经历了一些代码,并考虑是否需要小心处理Debug.Assert语句中的表达式,例如昂贵的操作或带有副作用的表达式.但是,看起来编译器在完全删除Assert语句和内部表达式方面非常聪明.

例如,以下内容仅在调试版本上打印:

static void Main(string[] args)
{
    Debug.Assert(SideEffect());
}
private static bool SideEffect()
{
    Console.WriteLine("Side effect!");
    return true;
}
Run Code Online (Sandbox Code Playgroud)

这会抱怨o在发布版本初始化之前使用它:

static void Main(string[] args)
{
    object o;
    Debug.Assert(Initialize(out o));
    o.ToString();
}
private static bool Initialize(out object o)
{
    o = new object();
    return true;
}
Run Code Online (Sandbox Code Playgroud)

它甚至可以表达这样的表达(在两种情况下打印"After"):

static void Main(string[] args)
{
    if (false) Debug.Assert(true);
    Console.WriteLine("After");
}
Run Code Online (Sandbox Code Playgroud)

我对编译器的智能程度以及Debug.Assert删除时正确检测案例的能力感到有些惊讶.所以,它让我好奇..

  • 该陈述究竟是如何删除的?必须在删除语句之前构建表达式树,才能正确执行上述if语句.
  • System.Diagnostics.Debug这里的类是特殊的,还是可以用类似的处理来构建自己的方法?
  • 有没有办法在这里"欺骗"预处理器?更好的是,在现实世界的代码中可能会遇到哪些情况可能会出现问题?

c# debugging assert

24
推荐指数
2
解决办法
5871
查看次数

单元测试:断言存在文件/路径

我正在尝试为我的安装程序创建回归测试.回归测试是用Python编写的脚本.测试检查是否在正确的位置安装了正确的文件.

有没有办法断言文件/文件夹存在?我收到以下代码的AssertionError错误:

assert os.path.exists(LOCAL_INSTALL_DIR) == 1
Run Code Online (Sandbox Code Playgroud)

为什么我会收到此错误,如何解决?我的功能:

def check_installation_files_exist():
    assert os.path.exists(LOCAL_INSTALL_DIR) == 1
    assert os.path.exists(INSTALL_DIR) == 1
    correct_install_files = normalise_file_names( os.listdir( LOCAL_INSTALL_DIR ) )
    installed_files       = normalise_file_names( os.listdir( INSTALL_DIR ) )
Run Code Online (Sandbox Code Playgroud)

python unit-testing assert

24
推荐指数
1
解决办法
2万
查看次数

为什么我们不能将断言用于公共方法?

为什么我们不能将断言用于公共方法?

我在某处读过

"断言在公共方法中是不合适的,因为该方法保证它总是强制执行参数检查.公共方法必须检查其参数是否启用断言.此外,断言构造不会抛出指定类型的异常.它只能抛出一个AssertionError".

那么,它也不适用于私人方法吗?
我没有清楚地理解上述陈述

java assert public-method

23
推荐指数
2
解决办法
6388
查看次数

当assert()失败时,程序退出代码是什么?

assert()呼叫失败时,使用的退出代码是什么,它在哪里记录?

c linux assert

22
推荐指数
1
解决办法
6976
查看次数

assert()应该在哪里使用C resp.C++?

我们应该assert()具体使用这个功能的地方有哪些?如果确定整数值是否大于零或指针是否为空,我们可以简单地使用私有函数来检查它.在这种情况下,我们应该在哪里使用assert()自定义书面支票?

c c++ debugging assert

22
推荐指数
2
解决办法
7041
查看次数

xUnit等于MSTest的Assert.Inconclusive

什么是以下MSTest代码的xUnit等价物:

Assert.Inconclusive("Reason");
Run Code Online (Sandbox Code Playgroud)

这给出了黄色测试结果,而不是通常的绿色或红色.我想断言由于某些条件而无法运行测试,并且在满足这些条件后应该重新运行测试.

unit-testing assert mstest xunit assertion

22
推荐指数
2
解决办法
4116
查看次数

模糊方法调用Assert中的assertEquals(Object,Object)和Assert匹配中的assertEquals(double,double):

我收到以下错误:

Both assertEquals(Object, Object) in Assert and assertEquals(double, double) in Assert match
Run Code Online (Sandbox Code Playgroud)

对于我的Junit测试中的这行代码,请注意getScore()返回一个double:

assertEquals(2.5, person.getScore());
Run Code Online (Sandbox Code Playgroud)

这是我的断言导入:

import static org.junit.Assert.*;
Run Code Online (Sandbox Code Playgroud)

造成这种情况的原因是什么?如何解决这个问题?

java double junit assert object

22
推荐指数
2
解决办法
2万
查看次数

如何在没有运行时成本的情况下基于断言来指导GCC优化?

我有一个宏在我的代码中使用,在调试模式下:

#define contract(condition) \
    if (!(condition)) \
        throw exception("a contract has been violated");
Run Code Online (Sandbox Code Playgroud)

...但在发布模式下:

#define contract(condition) \
    if (!(condition)) \
        __builtin_unreachable();
Run Code Online (Sandbox Code Playgroud)

这样做的原因assert()是,在发布版本中,由于UB传播,编译器可以大量优化代码.

例如,使用以下代码进行测试:

int foo(int i) {
    contract(i == 1);
    return i;
}

// ...

foo(0);
Run Code Online (Sandbox Code Playgroud)

...在调试模式下抛出异常,但return 1;在释放模式下为无条件生成程序集:

foo(int):
        mov     eax, 1
        ret
Run Code Online (Sandbox Code Playgroud)

条件以及依赖它的一切都已经过优化.

我的问题出现在更复杂的条件下.当编译器无法证明条件没有副作用时,它不会将其优化出来,与不使用合同相比,这是一个严重的惩罚.

有没有办法表明合同中的条件没有副作用,所以总是优化出来?

c++ optimization gcc assert compiler-optimization

22
推荐指数
3
解决办法
1104
查看次数

如何将防御性编程技术结合在一起?

我想问你的问题很广泛但同时它非常具体.首先,我必须说,我最感兴趣的是适用于.net环境的答案.

好吧,我想提高我生成的代码级别.现在我主要使用TDD和静态代码分析来确保我的代码是正确的.最近我听了Dino Esposito关于代码合同的演讲,现在我想将它与其他技术结合使用.在听Dino的同时我也回忆起了Debug.Assert()Trace.Assert().

具体来说,我会问几个问题:

  • 我应该如何编写合同和单元测试以相互补充?
  • 我应该只在每种方法或公共方法中使用代码合同吗?
  • 我应该阻止使用Debug.Assert()吗?什么时候可以使用它们?(例如,请注意.net中的不变量仅在公共方法/属性出口处进行检查.那么,通过简单方法在方法中间进行一些检查是否可以Assert()?)
  • 你能否推荐我一个开源项目,所有这些技术都被正确使用,因为一张图片描绘了千言万语?

c# defensive-programming assert code-contracts fail-fast

21
推荐指数
1
解决办法
1133
查看次数