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 次 |
| 最近记录: |