作为工作示例,我们可以处理以下代码:
#include <sys/socket.h>
#define size_t SOCKET
int receive_socket_data(SOCKET sock,//socket representing remote connection
unsigned long& version_number,//validPtr->version #
unsigned long& message_size,//validPtr->sizeof packet
char*& buf // where to copy data from packet
)
{
int nlen = 0;
buf = NULL;
// Receive version_number from the packet
nlen = recv(sock, (char*) &version_number, sizeof(version_number), 0);
if (nlen == 0 || nlen == -1) return ERROR_RECEIVING;
version_number = ntohl(version_number);
// Receive message_size from the entire packet
// (ulong + ulong + sizeof data)
nlen = recv(sock, (char*) &message_size, sizeof(message_size), 0);
if (nlen == 0 || nlen == -1) return ERROR_RECEIVING;
message_size = ntohl(message_size);
// Allocate a buffer to copy the data part of the packet
buf = new char[message_size + 1 - 2 * sizeof(unsigned long)];
buf[message_size - 2 * sizeof(unsigned long)] = '\0';
// Copy the data part from the packet to the buffer
if (recv(sock, (char*) buf, message_size-2*sizeof(unsigned long), 0) == -1)
return ERROR_RECEIVING;
return SUCCESS_RECEIVING;
}
Run Code Online (Sandbox Code Playgroud)
例如,我想到的是操作员新错误可能引发的错误.
我不确定数组的索引计算是否也会导致问题.
一种可以帮助确定功能的方法是安全的,包括证明和测试以及防御性编码和审查和经验.
防御性编码,因为任意代码不值得分析.使您的代码更易于分析和更安全,然后分析问题.你无法分析任意程序.甚至那些在理论上可以分析的东西也会在很大程度上改变难度.
证明,正如你的功能正确的正式证明.这需要完全理解和规范代码与之交互的所有内容.请注意,防御性编码和简化代码使这有点可能.
测试,因为证明只与您对代码所做的知识有关.你的代码模型可能不完整 - 哎呀,我甚至会说它肯定是不完整的.你没有一个模型,说明当前未知物理如何导致代码在你的代码运行的每个硬件中翻转,这是一个模型如何不完整的荒谬例子.几乎可以肯定的是,您的代码模型不完整的方式会更加荒谬.
回顾一下,因为会有一些你没有想过的事情,并且让更多有能力的人相信你的代码是正确的可以增加你不会错过任何东西的机会.
经验,因为知道在哪里集中注意力是很重要的.经验是记住你过去如何搞砸了,或目睹了别人这样做.
安全必须有多安全?通常,安全代码不容易编写.这就是为什么编写加密系统的第一条规则是"不要".
recv
- 你检查0或-1.如果它返回-2或 - (2 ^ 31)会发生什么?保证不会发生?然后证明一下.完成所有这些后,您将需要攻击您的代码并尝试打破它.
你会希望别人做同样的事情.
归档时间: |
|
查看次数: |
158 次 |
最近记录: |