gpt4 book ai didi

c++ - 如何在函数参数初始化中捕获未定义的行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:33 24 4
gpt4 key购买 nike

以下代码在 clang++ 中有效,但在 g++ 中会崩溃

#include<vector>
#include<iostream>

template<class Iterator>
double abs_sum(double current_sum, Iterator it, Iterator it_end){
if (it == it_end)
return current_sum;
return abs_sum(current_sum+std::abs(*it),++it,it_end);
}


int main(int argc, char** argv){
std::vector<double> values {1.0, 2.0,-5};

std::cout << abs_sum(0.0,values.begin(),values.end()) << std::endl;;
}

罪魁祸首原来是这一行:

return abs_sum(current_sum+std::abs(*it),++it,it_end);

在 clang 中,*it++it 之前求值,在 g++ 中则相反,导致迭代器在取消引用之前增加。事实证明,评估函数参数的顺序是实现定义的。

我的问题是:如何捕获此类错误?理想情况下,当我不小心依赖于实现的特定细节时,我希望有一个错误或至少一个警告。

clang 和 gcc 都不会产生任何警告,即使使用 -Wall。

最佳答案

My question is: How do I catch this type of error?

你不知道。未定义的行为是未定义的。你抓不到它...

...但是一些工具可以帮助您:

  • 您的编译器:启用所有警告(g++/clang++ -Wall -Wextra -pedantic 是一个好的开始);
  • cpp检查;
  • clang 分析器;

虽然他们不提供任何保证。这就是 C++ 的原因。您(您,编码员)最了解并且不编写 UB。祝你好运。

关于c++ - 如何在函数参数初始化中捕获未定义的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53778063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com