Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
2901591f
C
ClickHouse
项目概览
2dot5
/
ClickHouse
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ClickHouse
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
2901591f
编写于
2月 01, 2021
作者:
A
alexey-milovidov
提交者:
GitHub
2月 01, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #19876 from ClickHouse/intdiv-ubsan
Fix UBSan report in intDiv
上级
c4a3acd4
57664bff
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
25 addition
and
0 deletion
+25
-0
src/Functions/DivisionUtils.h
src/Functions/DivisionUtils.h
+24
-0
tests/queries/0_stateless/01683_intdiv_ubsan.reference
tests/queries/0_stateless/01683_intdiv_ubsan.reference
+0
-0
tests/queries/0_stateless/01683_intdiv_ubsan.sql
tests/queries/0_stateless/01683_intdiv_ubsan.sql
+1
-0
未找到文件。
src/Functions/DivisionUtils.h
浏览文件 @
2901591f
...
...
@@ -3,8 +3,10 @@
#include <cmath>
#include <type_traits>
#include <Common/Exception.h>
#include <Common/NaNUtils.h>
#include <DataTypes/NumberTraits.h>
#if !defined(ARCADIA_BUILD)
# include <Common/config.h>
#endif
...
...
@@ -87,7 +89,19 @@ struct DivideIntegralImpl
return
static_cast
<
Result
>
(
checkedDivision
(
static_cast
<
SignedCastA
>
(
a
),
static_cast
<
SignedCastB
>
(
b
)));
}
else
{
if
constexpr
(
std
::
is_floating_point_v
<
A
>
)
if
(
isNaN
(
a
)
||
a
>
std
::
numeric_limits
<
CastA
>::
max
()
||
a
<
std
::
numeric_limits
<
CastA
>::
lowest
())
throw
Exception
(
"Cannot perform integer division on infinite or too large floating point numbers"
,
ErrorCodes
::
ILLEGAL_DIVISION
);
if
constexpr
(
std
::
is_floating_point_v
<
B
>
)
if
(
isNaN
(
b
)
||
b
>
std
::
numeric_limits
<
CastB
>::
max
()
||
b
<
std
::
numeric_limits
<
CastB
>::
lowest
())
throw
Exception
(
"Cannot perform integer division on infinite or too large floating point numbers"
,
ErrorCodes
::
ILLEGAL_DIVISION
);
return
static_cast
<
Result
>
(
checkedDivision
(
CastA
(
a
),
CastB
(
b
)));
}
}
#if USE_EMBEDDED_COMPILER
...
...
@@ -114,6 +128,16 @@ struct ModuloImpl
}
else
{
if
constexpr
(
std
::
is_floating_point_v
<
A
>
)
if
(
isNaN
(
a
)
||
a
>
std
::
numeric_limits
<
IntegerAType
>::
max
()
||
a
<
std
::
numeric_limits
<
IntegerAType
>::
lowest
())
throw
Exception
(
"Cannot perform integer division on infinite or too large floating point numbers"
,
ErrorCodes
::
ILLEGAL_DIVISION
);
if
constexpr
(
std
::
is_floating_point_v
<
B
>
)
if
(
isNaN
(
b
)
||
b
>
std
::
numeric_limits
<
IntegerBType
>::
max
()
||
b
<
std
::
numeric_limits
<
IntegerBType
>::
lowest
())
throw
Exception
(
"Cannot perform integer division on infinite or too large floating point numbers"
,
ErrorCodes
::
ILLEGAL_DIVISION
);
throwIfDivisionLeadsToFPE
(
IntegerAType
(
a
),
IntegerBType
(
b
));
if
constexpr
(
is_big_int_v
<
IntegerAType
>
||
is_big_int_v
<
IntegerBType
>
)
...
...
tests/queries/0_stateless/01683_intdiv_ubsan.reference
0 → 100644
浏览文件 @
2901591f
tests/queries/0_stateless/01683_intdiv_ubsan.sql
0 → 100644
浏览文件 @
2901591f
SELECT
DISTINCT
intDiv
(
number
,
nan
)
FROM
numbers
(
10
);
-- { serverError 153 }
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录