Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么唯一有符号整数类型会在clang中引起溢出警告_C++_Integer_Compiler Warnings - Fatal编程技术网

C++ 为什么唯一有符号整数类型会在clang中引起溢出警告

C++ 为什么唯一有符号整数类型会在clang中引起溢出警告,c++,integer,compiler-warnings,C++,Integer,Compiler Warnings,以下最简单的代码示例导致一个警告: #include <iostream> #include <climits> int b = INT_MAX + 1; //warning: overflow in expression; result is -2147483648 //with type 'int' [-Winteger-overflow] unsigned int a = INT_MAX + 1; //OK int m

以下最简单的代码示例导致一个警告:

#include <iostream>
#include <climits>

int b = INT_MAX + 1; //warning: overflow in expression; result is -2147483648 
                     //with type 'int' [-Winteger-overflow]

unsigned int a = INT_MAX + 1; //OK
int main()
{
    std::cout << b << std::endl << a;
}
  if (LHS.isUnsigned())
    return Op(LHS, RHS);
#包括
#包括
int b=int_MAX+1//警告:表达式溢出;结果是-2147483648
//类型为“int”[-Winteger溢出]
无符号整数a=int_MAX+1//好啊
int main()
{

虽然结果是“正确的”,但这是一个bug。据我所知,这个操作实际上在add操作之前变成了一个无符号的

该警告由该代码生成,该代码显然会检查未签名,并跳过溢出检查(注释中明确说明并涵盖):

减少程序(删除
#includes
,从相关标头复制
#define INT_MAX…
),并使用
clang++-Xclang-ast dump…
运行clang,将产生以下输出:

TranslationUnitDecl 0x4ca2830 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x4ca2d70 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
|-TypedefDecl 0x4ca2dd0 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'
|-TypedefDecl 0x4ca3190 <<invalid sloc>> <invalid sloc> implicit __builtin_va_list '__va_list_tag [1]'
|-VarDecl 0x4ca31f0 <of.cpp:3:1, col:19> col:5 b 'int' cinit
| `-BinaryOperator 0x4ca3288 <line:1:19, line:3:19> 'int' '+'
|   |-IntegerLiteral 0x4ca3248 <line:1:19> 'int' 2147483647
|   `-IntegerLiteral 0x4ca3268 <line:3:19> 'int' 1
|-VarDecl 0x4ce2280 <line:6:1, col:28> col:14 a 'unsigned int' cinit
| `-ImplicitCastExpr 0x4ce2340 <line:1:19, line:6:28> 'unsigned int' <IntegralCast>
|   `-BinaryOperator 0x4ce2318 <line:1:19, line:6:28> 'int' '+'
|     |-IntegerLiteral 0x4ce22d8 <line:1:19> 'int' 2147483647
|     `-IntegerLiteral 0x4ce22f8 <line:6:28> 'int' 1
`-FunctionDecl 0x4ce23b0 <line:7:1, line:10:1> line:7:5 main 'int (void)'
  `-CompoundStmt 0x4ce24a8 <line:8:1, line:10:1>

我会再看一眼,看看是否能找出这到底是哪里出了问题。但这需要等待一段时间…

我同意T.C.,这是一个bug(或者可能是一个特性).我会看看我是否能弄清楚它是如何工作的。但是,我还有一些其他的事情,比如吃早餐,我现在需要做,所以它将不得不等待一段时间-可能需要几个小时,直到我重新开始。UB…?环顾四周,我发现很多地方都说…“涉及无符号操作数的计算永远不会溢出…”@Chieftwo Pencils该赋值的rhs被签名,直到该赋值被摘要提升为unsigned。实际的加法是两个
int
,因此这个bug。
g++
做了正确的事情,顺便说一句。@Chieftwo Pencils既没有
int\u MAX
也没有
1
未签名。我在破解clang时帮了大忙就在前几天,“不为X出错”,所以我知道如何搜索错误并找到它们的用法……这一次非常简单,真的,因为它只发生在一个地方。有些错误发生在11个不同的地方,这让它变得不那么有趣!;)
TranslationUnitDecl 0x4ca2830 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x4ca2d70 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
|-TypedefDecl 0x4ca2dd0 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'
|-TypedefDecl 0x4ca3190 <<invalid sloc>> <invalid sloc> implicit __builtin_va_list '__va_list_tag [1]'
|-VarDecl 0x4ca31f0 <of.cpp:3:1, col:19> col:5 b 'int' cinit
| `-BinaryOperator 0x4ca3288 <line:1:19, line:3:19> 'int' '+'
|   |-IntegerLiteral 0x4ca3248 <line:1:19> 'int' 2147483647
|   `-IntegerLiteral 0x4ca3268 <line:3:19> 'int' 1
|-VarDecl 0x4ce2280 <line:6:1, col:28> col:14 a 'unsigned int' cinit
| `-ImplicitCastExpr 0x4ce2340 <line:1:19, line:6:28> 'unsigned int' <IntegralCast>
|   `-BinaryOperator 0x4ce2318 <line:1:19, line:6:28> 'int' '+'
|     |-IntegerLiteral 0x4ce22d8 <line:1:19> 'int' 2147483647
|     `-IntegerLiteral 0x4ce22f8 <line:6:28> 'int' 1
`-FunctionDecl 0x4ce23b0 <line:7:1, line:10:1> line:7:5 main 'int (void)'
  `-CompoundStmt 0x4ce24a8 <line:8:1, line:10:1>
|   `-BinaryOperator 0x4ce2318 <line:1:19, line:6:28> 'int' '+'
|     |-IntegerLiteral 0x4ce22d8 <line:1:19> 'int' 2147483647
|     `-IntegerLiteral 0x4ce22f8 <line:6:28> 'int' 1
| `-ImplicitCastExpr 0x4ce2340 <line:1:19, line:6:28> 'unsigned int' <IntegralCast>