gpt4 book ai didi

c - 在 C 中,你是否应该始终使用 'int' 作为数字,即使它们是非负数?

转载 作者:太空狗 更新时间:2023-10-29 16:19:16 28 4
gpt4 key购买 nike

我总是将 unsigned int 用于永远不应为负的值。但是今天我在我的代码中注意到这种情况:

void CreateRequestHeader( unsigned bitsAvailable, unsigned mandatoryDataSize, 
unsigned optionalDataSize )
{
If ( bitsAvailable – mandatoryDataSize >= optionalDataSize ) {
// Optional data fits, so add it to the header.
}

// BUG! The above includes the optional part even if
// mandatoryDataSize > bitsAvailable.
}

我应该开始对数字使用 int 而不是 unsigned int 吗,即使它们不能为负吗?

最佳答案

有一件事没有提到,交换有符号/无符号数字会导致安全漏洞。这是一个问题,因为标准 C 库中的许多函数接受/返回无符号数(fread、memcpy、malloc 等都接受 size_t 参数)

例如,采用以下无害的示例(来自真实代码):

//Copy a user-defined structure into a buffer and process it
char* processNext(char* data, short length)
{
char buffer[512];
if (length <= 512) {
memcpy(buffer, data, length);
process(buffer);
return data + length;
} else {
return -1;
}
}

看起来无害,对吧?问题是 length已签名,但在传递给 memcpy 时转换为无符号.因此将长度设置为 SHRT_MIN将验证 <= 512测试,但导致memcpy将超过 512 个字节复制到缓冲区 - 这允许攻击者覆盖堆栈上的函数返回地址并(经过一些工作后)接管您的计算机!

您可能会天真地说,“很明显长度需要为 size_t 或检查为 >= 0 ,我永远不会犯那个错误”。除了,我保证如果你曾经写过任何不平凡的东西,你就写过。 Windows 的作者也是如此, Linux , BSD , Solaris , Firefox , OpenSSL , Safari , MS Paint , Internet Explorer , Google Picasa , Opera , Flash , Open Office , Subversion , Apache , Python , PHP , Pidgin , Gimp , ... 不断 ... - 这些都是聪明的人,他们的工作是了解安全。

简而言之,总是使用size_t尺寸。

男人,programming is hard .

关于c - 在 C 中,你是否应该始终使用 'int' 作为数字,即使它们是非负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3259413/

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