gpt4 book ai didi

c++ - clang 给我警告标志更改,但是代码仍然会产生正确的输出

转载 作者:行者123 更新时间:2023-12-01 14:39:12 25 4
gpt4 key购买 nike

我正在分析一个代码库中的一些警告,并对Clang生成的警告感到困惑

考虑以下C++代码:

#include <iostream>

int main(int , char *[])
{

uint32_t val1 = 10;
int32_t val2 = -20;

int32_t result = val1 + val2;
std::cout << "Result is " << result << "\n";

return 0;
}


当用 -Wconversion编译此代码时,Clang给我以下警告

<source>:9:25: warning: implicit conversion changes signedness: 
'unsigned int' to 'int32_t' (aka 'int') [-Wsign-conversion]

int32_t result = val1 + val2;

~~~~~~ ~~~~~^~~~~~
<source>:9:27: warning: implicit conversion changes signedness:
'int32_t' (aka 'int') to 'unsigned int' [-Wsign-conversion]

int32_t result = val1 + val2;

~ ^~~~
2 warnings generated.

GCC也向我发出此警告,但是我需要提供 -Wsign-conversion来触发它。

警告说 val2将被强制转换为 unsigned int,因此将失去其符号。到现在为止还挺好。但是,我期望上面的代码会产生不正确的输出,令我惊讶的是,它运行得很好。

Result is -10

查看在两个编译器 on godbolt上运行的程序。

强制转换不会在已编译的代码中发生,并且 val2保留其原始值。计算结果正确。此警告警告我的实际危险是什么?我该如何触发这种行为?警告是假的吗?

最佳答案

What is the actual danger that this warning is warning me against?



潜在的危险是您可能没有意识到隐式符号转换,而只是偶然地进行了转换。如果它是有意的并且表现理想,则没有危险)。

How can I trigger this behaviour?



您已经触发了隐式符号转换。

就是说,如果您希望看到一些可能令您惊讶的输出,请尝试以下方法:
std::cout << val1 + val2;

Is the warning bogus?



取决于您对假冒的定义。

程序中肯定有隐式符号转换,因此,如果您要求编译器警告隐式符号转换,则编译器警告程序中的隐式符号转换是完全正确的。

有一个原因为何默认情况下,在使用-Wall启用“所有”警告时,甚至在使用-Wextra启用“额外”警告时均未启用此警告选项。这些符号转换警告警告程序具有明确定义的行为,但是对于那些没有密切注意的人来说可能会感到惊讶。尽管有此警告,程序仍可能有意义且正确。

关于c++ - clang 给我警告标志更改,但是代码仍然会产生正确的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62398873/

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