Mui*_*uis 6 c string gcc c99 buffer-overflow
我有很多函数需要一个字符串作为参数,我使用它char*
,但我所有期望字节数组的函数也使用char*
.
问题是我很容易犯错误,在字符串函数中传递一个字节数组,导致各种溢出,因为无法找到空终止符.
这通常如何解决?我可以想象改变我的所有字节数组函数uint8_t
,然后编译器会在传递字符串时发出有关signed-ness的警告.或者这里的正确方法是什么?
这个问题在 C 中比你想象的更普遍。由于char*
和char[]
对于函数参数来说是等价的,因此这样的参数可能指三个不同的语义概念:
char
(这是指针类型的“官方”定义)char
数组在大多数情况下,C 标准中的现代接口可能使用void*
非类型化字节数组,并且您应该遵守该约定,并且char*
仅用于字符串。
char[]
单独使用可能很少;我无法想象这些的很多用例。如果您将它们视为数字,则应该使用signed
或unsigned
变体,如果您将它们视为位模式,则unsigned char
应该选择。
如果您确实将数组作为函数参数(char
或不是),您可以通过清楚地指示它来为代码的临时读者标记这一事实:
void toto(size_t n, char A[const n]);
Run Code Online (Sandbox Code Playgroud)
这相当于
void toto(size_t n, char *const A);
Run Code Online (Sandbox Code Playgroud)
但让你的意图更清晰。将来甚至可能会有工具为您进行边界检查。
归档时间: |
|
查看次数: |
663 次 |
最近记录: |