gpt4 book ai didi

c++ - 我如何强制 C++ 编译器对可能不需要的整数提升发出警告?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:10:16 25 4
gpt4 key购买 nike

今天我想编写一个小函数来以二进制形式呈现最多 64 位的整数。在那里我遇到了一个问题,这显然是由于无声整数提升引起的。下面的源代码显示了问题。

#include <iostream>
#include <string>

using namespace std;

string pretty(uint64_t);
string pretty_correct(uint64_t);

string pretty(uint64_t var)
{
string result;
result.reserve(50);
for ( short i=63; i>=0; --i ) {
if ( var & (0x1 << i) )
result.append(1,'|');
else
result.append(1,'O');
}

return result;
}

string pretty_correct(uint64_t var)
{
string result;
result.reserve(50);
for ( short i=63; i>=0; --i ) {
if ( var & (static_cast<unsigned short>(0x1 << i)))
result.append(1,'|');
else
result.append(1,'O');
}

return result;
}

int main() {
cout << pretty(12345678901234567890U) << " <- wrong!"<< endl;
cout << pretty_correct(12345678901234567890U) << " <- right!"<< endl;
}

我正在寻找一种方法让 GCC(或者可能是 Clang)发出针对此类问题的警告。到目前为止呈现给我的所有解决方案都让我以某种方式先见之明地意识到可能会发生这种问题。但现在发生这种情况的方式可能会在我的代码中引入细微的错误,这将很难追踪。

编辑:这些是我用于编译的命令:
g++ -std=c++14 -Wall -Wextra -pedantic-errors -Wconversion -g -o 测试用例 testcase.cpp
clang -std=c++14 -Weverything -g -o 测试用例 testcase.cpp -lm -lstdc++

最佳答案

首先,您的 pretty_correct()功能实际上是不正确的。原因是表达式 0x1 << ii >= 32 时产生 UB :你只能移动不超过类型长度的符号( source )。这可能是您希望看到的警告。

有几种方法可以修复它。第一个是给 1 添加 type-qualifier:

if (var & (1ull << i))

虽然我更喜欢

if ((var >> i) & 1)

因为您不必考虑“它必须是 1u 还是 1ll 或其他什么”。

现在关于警告:no, there are no such warnings既不在 GCC 也不在 Clang。但是,Clang sanitizer 为您提供了一个选项,可以在运行时使用 -fsanitize=shift 检查它。 :

$ clang++-3.5 -std=c++11 -Wall -Wextra -O2 a.cpp -fsanitize=shift
$ ./a.out
a.cpp:14:25: runtime error: shift exponent 63 is too large for 32-bit type 'int'
|||O|O||OOO|||||OOOO|O|O||O|OO|O|||O|O||OOO|||||OOOO|O|O||O|OO|O <- wrong!
a.cpp:28:53: runtime error: shift exponent 63 is too large for 32-bit type 'int'
OOOOOOOOOOOOOOOOOOOO|O|O||O|OO|OOOOOOOOOOOOOOOOOOOOO|O|O||O|OO|O <- right!

关于c++ - 我如何强制 C++ 编译器对可能不需要的整数提升发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42846971/

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