这个问题有很多很好的答案,可以解释为什么bug只能在Release版本中表现出来
Common reasons for bugs in release version not present in debug mode
关于未定义的行为,我有一个更具体的问题。
如果程序总是在Debug构建中正常工作,但在发布版本中表现不同(但总是以相同的错误方式运行),问题可能是由于未定义的行为造成的吗?
答案 0 :(得分:1)
可以是由于未定义的行为吗?当然。由于未定义的行为,总是吗?当然不是。
想象一下:
assert(scanf("%d", &n) == 1);
此行将在发布模式下被删除。它不是未定义的行为,但它肯定会使您的程序以不同的方式运行。
assert
可能是一个明显的例子,但想想这个更复杂的情况:
#ifndef NDEBUG
# define DBG(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
#else
# define DBG(fmt, ...) ((void)0)
#endif
int shared_var;
static inline void do_something_fast(void)
{
DBG("doing something fast\n");
shared_var = something_fast();
}
并有线程1:
...
mutex_unlock();
local_var = shared_var;
...
和主题2:
...
mutex_lock();
do_something_fast();
...
现在这个例子是完全荒谬的,但是这些内容在多线程环境中很常见。在这个例子中,会发生这种情况:
shared_var
的旧值复制到local_var
shared_var
shared_var
的新值复制到local_Var
正如您所看到的,在此示例中,阻塞I / O强制线程之间的某种行为,这本身仅在调试模式下启用。这也意味着在调试中工作的程序可能与编译发布时的行为不同。