Hacker News 地址:
https://news.ycombinator.com/item?id=14214034
原文地址:
https://akrzemi1.wordpress.com/2017/04/27/a-serious-bug-in-gcc/
Bug 地址:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66139
经测试 clang 和 visual C++ 都是正确的。
测试 Visual C++ 可以移步: http://webcompiler.cloudapp.net/
感觉这对 RAII 影很大。
1
AngelCriss 2017-04-28 11:32:32 +08:00
所以,构造函数不要抛异常啊。
|
2
limhiaoing 2017-04-28 11:34:41 +08:00 via iPhone
@AngelCriss
都说是 bug 了 |
3
enenaaa 2017-04-28 11:45:32 +08:00
注意限制使用匿名对象即可
|
4
owt5008137 2017-04-28 13:19:18 +08:00 via Android
所以即便是 RAII,也不要在构造函数内抛异常
|
5
forcecharlie OP |
6
Monad 2017-04-28 13:41:14 +08:00
RAII 可不能搞一个 temporary 对象
所以是怎么发现的... |
7
owt5008137 2017-04-28 16:19:27 +08:00 via Android
@forcecharlie 即便是个 BUG,你也得为它买单
|
8
forcecharlie OP @owt5008137 针对这个 bug 评估风险,风险大的地方我已经使用 clang 了,比如 基于 cpprestsdk 的 git LFS 服务器( Linux ),安装文档要求使用 clang。部署脚本优先使用 clang。
|
9
limhiaoing 2017-04-29 08:45:32 +08:00 via iPhone
|
10
limhiaoing 2017-04-29 09:06:50 +08:00 via iPhone
15 年报告的 bug,但 gcc 似乎不着急解决。
bug 单里 Tomasz Kamiński 的例子的写法在 C++11 其实还是挺常见的。 在 gcc 解决前想继续使用 gcc 编译的话可以用代码静态分析扫描一遍,给 aggregate initialization 的匿名对象加个变量名就好了。 |
11
limhiaoing 2017-04-29 09:16:16 +08:00 via iPhone
@owt5008137
另外这个 bug 并不是构造函数抛异常导致的,bug 单里 Tomasz Kamiński 的例子是 std::basic_string::at 抛的异常。 |
12
limhiaoing 2017-04-29 09:17:15 +08:00 via iPhone
@limhiaoing
说错了,是 std::vector::at 抛的异常。 |
13
owt5008137 2017-04-29 09:55:26 +08:00 via Android
@limhiaoing 确实比较坑。所以很多 c++项目和我们都是不使用异常的
|