【发布时间】:2008-10-15 20:48:15
【问题描述】:
我希望我的代码对 VS.NET 和 GCC 没有警告,我希望我的代码准备好 64 位。
今天我写了一个小模块,它处理内存缓冲区并通过文件样式接口提供对数据的访问(例如,您可以读取字节、写入字节、四处寻找等)。
作为当前读取位置和大小的数据类型,我使用了 size_t,因为这似乎是最自然的选择。我绕过警告,它也应该在 64 位下工作。
以防万一:我的结构如下所示:
typedef struct
{
unsigned char * m_Data;
size_t m_CurrentReadPosition;
size_t m_DataSize;
} MyMemoryFile;
size_t 的签名在实践中似乎没有定义。谷歌代码搜索证明了这一点。
现在我处于两难境地:我想用size_t 检查添加是否溢出,因为我必须处理用户提供的数据,而第三方库将使用我的代码。但是,对于溢出检查,我必须知道符号。它在实施中产生了巨大的差异。
那么 - 我到底应该如何以独立于平台和编译器的方式编写这样的代码?
我可以在运行或编译时检查size_t 的签名吗?那将解决我的问题。或者,size_t 一开始就不是最好的主意。
有什么想法吗?
编辑:我正在寻找 C 语言的解决方案!
【问题讨论】:
-
您使用的是什么版本的 gcc?看起来他们在 2.4 之后(包括 2.4)的版本中使 size_t 未签名
-
我要处理的版本到处都是。我做嵌入式编程,有时我不得不使用石器时代的编译器版本。
-
“签名”是常用词。
标签: c integer-overflow size-t