首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >模size_t产生“表达式‘’的结果未定义”

模size_t产生“表达式‘’的结果未定义”
EN

Stack Overflow用户
提问于 2021-04-07 16:00:05
回答 1查看 103关注 0票数 2

在64位系统上,当使用模运算符和size_t类型时,我从clang分析器得到以下警告:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
htable.c:38:62: warning: The result of the ' ' expression is undefined [clang-analyzer-core.UndefinedBinaryOperatorResult]
return ht->num_buckets > 0 ? (ht->hash_fn(key, ht->seed) % ht->num_buckets)
                                                         ^

Complete trace

哈希函数的结果是无符号的,存储桶的数量也是无符号的,最终转换成无符号size_t。AFAIK结果不能为负,我检查了存储桶的数量是否为零。

哈希函数可能会溢出,但因为它用于链哈希表,所以这不会导致问题(如果我没有弄错的话)。

这是怎么回事?这是假阳性吗?

出现警告的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static size_t
htable_bucket_idx(htable_t* ht, void* key)
{
    if (!ht || !key) {
        printf("htable - bucket_idx: Invalid Argument!\n");
        exit(-1);
    }

    return ht->num_buckets > 0 ? (ht->hash_fn(key, ht->seed) % ht->num_buckets)
                               : ht->hash_fn(key, ht->seed);
}

散列函数是FNV散列函数的粗略简化版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
size_t
fnv_hash_ul(const void* in, unsigned int seed)
{
    size_t             h     = seed;
    const unsigned int prime = 0xFDCFB7;
unsigned long ul = *((unsigned long*) in);

    return (h ^ ul) * prime;
}

htable_t的定义(为简洁起见,省略了其他类型,可根据请求追加)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef size_t (*htable_hash)(const void* in, unsigned int seed);

typedef struct htable
{
    htable_hash      hash_fn;
    htable_keq       keq;
    htable_cbs_t     cbs;
    htable_bucket_t* buckets;
    size_t           num_buckets;
    size_t           num_used;
    unsigned int     seed;
} htable_t;

函数的调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static int
htable_add_to_bucket(htable_t* ht, void* key, void* value, bool rehash)
{
    if (!ht || !key) {
        printf("htable - add_to_bucket: Invalid Argument!\n");
        exit(-1);
    }
    size_t idx = htable_bucket_idx(ht, key);

    [...]

编译器信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
clang version 11.1.0
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-linux-gnu/10.2.0
Candidate multilib: .;@m64

htable.c on GitHub

htable.h on GitHub

EN

回答 1

Stack Overflow用户

发布于 2021-04-08 15:49:01

实际上,这似乎是一种错误的肯定。通过将htable_rehash()从以下位置更改,我能够消除所有警告:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static int htable_rehash(htable_t* ht)
{
...
    ht->num_buckets <<= 1UL;
...
}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static int htable_rehash(htable_t* ht)
{
...
    ht->num_buckets *= 2;
...
}

真奇怪。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66989783

复制
相关文章
Excel揭秘23:公式结果产生的陷阱
然而,这会带来一些潜在的问题。例如,在单元格B2中输入数值,在单元格B3中有一个公式,当B2中的值大于3时,输入B2中的值,否则输入空,如下图1所示。
fanjy
2020/06/17
7380
Excel揭秘23:公式结果产生的陷阱
size_t类型
size_t在标准C库中定义,是sizeof()的返回类型。应为unsigned int,在64位系统中为 long unsigned int。 C 中头文件:#include<cstddef.h> C++中:#include<cstddef>
青木
2018/05/28
9610
wordpress 搜索结果去除 Simple Urls 插件产生的短链接
朋友的 wordpress 使用了 simple urls 插件来做外链转内链的工作,确实很方便,但是有一个弊端,就是在博客中搜索关键词的时候,搜索结果中就会出现 simple urls 插件生成的短连接,这样的搜索结果不是用户想要的,所以用户体验很差。为了避免这个问题魏艾斯博客找到了@欲思博客提供的一段代码,可以去除 wordpress 搜索结果中 Simple Urls 插件产生的短链接。
魏艾斯博客www.vpsss.net
2018/08/10
8030
中美谈判结果对锂电产生的危机与机遇
近日,由美国高官组成的谈判团队访华,就近来发生的贸易战与我国展开谈判。中美经贸磋商的结果是,双方在有些领域达成了一些共识,但在一些问题上还存在较大分歧。显然,一场由美国发起的针对“中国制造2025”的贸易战并不会就此停歇下来。但是,在这此贸易战中,“中兴事件”引发业界地震,而随后美国又将矛头指向华为……中兴被禁等事件,揭露了中国制造业缺乏核心技术的缺点,触动了国人的神经。从这些事件中,作为中国制造2025的关键行业——新能源汽车,为避免“扎心”,动力锂电池也要谨防危机发生,积极寻找出路。
SHOUT
2022/05/31
4450
中美谈判结果对锂电产生的危机与机遇
共模-差模
差模信号:就是这两个信号各自拥有的那部分:对于v1,VDiff=(v1-v2)/2;
crazy_hw
2022/08/29
7250
共模-差模
size_t和int区别
size_t和int size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。
全栈程序员站长
2022/09/06
8350
size_t与ssize_t
为了增强程序的可移植性,便有了size_t,它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t可能不一样。
Java架构师必看
2021/03/22
1.4K0
【练习】计算给定算数表达式的结果
给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
孟君
2020/04/23
1.2K0
认识 size_t 和指针类型的大小
size_t 概述: size_t 类型定义在 C++ 中的 cstddef 头文件中,该头文件文件是 C 标准库的头文件 stddef.h 的 C++ 版。它是一个与机器相关的 unsigned 整型类型,其大小足以保证存储内存中对象的大小。
恋喵大鲤鱼
2022/05/09
3.7K0
认识 size_t 和指针类型的大小
共模与差模噪声
线路中的噪声电流进入和流出,相同大小的电流以相反方向流动,总和始终为零,这种称之为差模传导。
硬件大熊
2022/06/23
4870
共模与差模噪声
矩阵的模的平方matlab,matlab求矩阵、向量的模
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/146721.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/28
8150
C Primer Plus(二)
本篇,我们看一下 C 语言中的两个输入输出函数: printf() 和 scanf()。
1ess
2021/11/01
5750
C/C++未定义行为
下面是一段代码,这段代码中有标准未定义的行为。代码如下: #include<iostream> using namespace std; int main() { int j = 0;
zy010101
2020/04/16
3.7K0
模具的开模流程
如今,模具工厂优秀的项目工程师人才紧缺,懂管理的不懂技术,夸夸其谈很容易在技术环节出问题;懂技术的不擅长管理,不会做文件,不太会与客户沟通....
lrglu
2022/03/31
3.2K0
模运算法则_模运算例题详解
若p是素数,a是正整数且不能被p整除,则:a^(p-1) mod p = 1 mod p 推论:
全栈程序员站长
2022/09/20
6970
matlab如何取模_matlab取模运算
mod函数采用floor,rem函数采用fix函数。那么什么是floor和fix?
全栈程序员站长
2022/09/20
1.1K0
Python中的模运算
所谓取模运算,就是计算两个数相除之后的余数,符号是%。如a % b就是计算a除以b的余数。用数学语言来描述,就是如果存在整数n和m,其中0 <= m < b,使得 a \% b = a - n * b = m 。
兜兜转转
2023/03/08
1.5K0
位与模的对白
位运算和模运算在日常的应用开发中倒也少见,主要是这两个概念更多是存在于新手教程中一笔带过,很多情况下都是说位运算主要是针对字节位来进行相关的处理,有或与非、异或和取模,这些概念我们也只是知道了一些相关的知识点,然后也就偶尔刷题的时候遇到了,不过这个概念对于系统、数值运算都是极友好的,此外还有的是在权限服务中有所应用,快不说,还稳。
Yerik
2021/04/06
6750
信号的产生
信号是表示消息的物理量,如电信号可以通过幅度、频率、相位的变化来表示不同的消息。这种电信号有模拟信号和数字信号两类。信号是运载消息的工具,是消息的载体。从广义上讲,它包含光信号、声信号和电信号等。按照实际用途区分,信号包括电视信号、广播信号、雷达信号,通信信号等;按照所具有的时间特性区分,则有确定性信号和随机性信号等。
FPGA开源工作室
2019/10/29
1.2K0
信号的产生
点击加载更多

相似问题

size_t模长无符号int的意外结果

11

Python模运算符产生意外结果

59

从双到size_t转换会产生错误的结果?

24

模产生“零除法”误差

10

模运算不会产生负数

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文