传递未初始化的变量安全
Passing uninitialized variables safety
我今天偶然发现了一些代码,我将其简化为:
#include <iostream>
using std::cout;
using std::cin;
bool changeX(int &x)
{
x = 5;
return true;
}
void printvals(bool bval, int intval)
{
cout << bval << " : " << intval;
}
int main()
{
int x;
printvals(changeX(x), x);
cin.get();
}
在这里,x
在传递给函数时仍未初始化printvals
但我可以肯定地说 x 在 printvals 使用它之前将始终被初始化吗?我尝试在VS2013调试模式下运行简化的代码,这给了我:Run-Time Check Failure #3 - The variable 'x' is being used without being initialized.
。但是,在发布模式下运行它运行良好并打印:1 : 5
按预期。
这是否意味着我可以在生产代码中使用此方法?x
是否总是在printvals
可以使用它之前进行初始化,这样它就不会导致 UB?
我可以肯定地说
x
在使用它之前printvals
总是被初始化吗?
否,未指定函数参数的计算顺序。由于您可能从未初始化的变量中读取,因此您的代码可能具有未定义的行为。您不能依赖调用changeX
的副作用。
函数中参数的求值顺序未指定,所以不,你不能这么说。
例如 http://en.cppreference.com/w/cpp/language/eval_order
或者如果你敢读"标准":),就看标准
PS:即使可能已经指定了顺序,避免这样的代码总是一个好主意,因为大多数时候阅读您的代码的其他人会遇到完全相同的问题,并且会浪费大量时间深入研究。只是更喜欢清晰而不是极其"聪明"的代码。
这可能会导致未定义的行为,因为执行顺序未指定(这取决于编译器)。
这是C++标准非常容易理解的地方之一。从 §8.3.6/9(在 N3797 中,强调我的):
未指定函数参数的计算顺序。
这意味着您不能依赖在调用changeX()
后将intval
评估为x
的副本。因此,您的代码是未定义的行为。
- 全局变量 多读取器 一个写入器多线程安全?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在函数结束后使用指向变量的指针是否安全?
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- C++11如何在1个线程中使用条件变量处理2个线程安全队列
- C++:用IIFE线程初始化静态局部变量安全吗
- std::mutex作为一个成员变量对多个线程来说是安全的吗
- 为什么我的 std::atomic<int> 变量不是线程安全的?
- 将常量引用成员设置为临时变量是否安全
- 是局部unordered_map变量线程在C 中安全的线程
- 如何修复编译错误"此函数或变量可能不安全"(strcpy)
- 为什么静态局部变量的 MSVC 线程安全初始化使用 TLS
- 将自动类型变量初始化为零.这种类型安全吗?
- 定义,初始化全局const变量是安全的吗?
- 当空变量没有定义时,按值传递它们是否安全
- 使用函数模板中静态局部变量的地址作为类型标识符是否安全
- 如何使类静态变量线程安全
- 使用局部静态std :: ARNE_FLAG和局部静态指针对静态变量的线程安全初始化
- 传递未初始化的变量安全
- 从lambda的内部框架修改via闭包中的变量安全吗?lambda是从一个不再存在的函数创建的