我的代码仅在使用 gdb 运行时才有效: gdb ./MyCode 跑
如果我只是输入: ./我的代码
这是我的代码失败的部分:
bool packageBuildFileDownload(char* receiver, char* finished, char* file_name, char* payload, char** json_string, size_t json_string_size) {
cJSON* json = packageCreateJson();
if (!json) return false;
typedef struct PackageAttribute {
char
*name,
*value;
} PackageAttribute;
PackageAttribute attributes[] = {
{
.name = "type",
.value = "filedownload"
},
{
.name = "receiver",
.value = receiver
},
{
.name = "file_name",
.value = file_name
},
{
.name = "finished",
.value = finished
},
{
.name = "payload",
.value = payload
}
};
int attributes_size = sizeof(attributes) / sizeof(attributes[0]);
for (int i = 0; i < attributes_size; i++) {
if (!cJSON_AddStringToObject(json, attributes[i].name, attributes[i].value)) {
cJSON_Delete(json);
return false;
}
}
if (!cJSON_PrintPreallocated(json, *json_string, json_string_size, false)) {
// cJSON_PrintPreallocated returns failour
cJSON_Delete(json);
return false;
}
cJSON_Delete(json);
return true;
}
static bool filedownloadrequestSendResponse(Socket* socket, uint8_t* file_buffer, size_t file_buffer_size, char* receiver, char* finished, char* file_name) {
char* b64_encode_buffer;
base64Encode(file_buffer, file_buffer_size, &b64_encode_buffer);
char* json_string = malloc(RESPONSE_PACKAGE_BUFFER_SIZE);
if (!packageBuildFileDownload(receiver, finished, file_name, b64_encode_buffer, &json_string, strlen(json_string))) {
free(json_string);
return false;
}
free(b64_encode_buffer);
CURLcode result = sendWs(socket->curl, json_string);
free(json_string);
if (result != CURLE_OK) {
fprintf(stderr, "sendWs() failed: %s\n", curl_easy_strerror(result));
return false;
}
return true;
}
我的 packageBuildFileDownload() 函数返回 false,因为 cJSON_PrintPrealulated 失败(cJSON_PrintPrealulated 是 cJSON 库的一部分)。仅当我由于某种原因不使用 gdb 时才会发生这种情况。
如果您需要更多代码,请告诉我:)
我的代码仅在使用 gdb 运行时才有效:
GDB 默认情况下禁用 ASLR。如果您重新启用 ASLR,您的代码可能会在 GDB 下停止工作:
gdb ./MyCode run
(gdb) set disable-randomization off
(gdb) run
如果启用 ASLR 导致程序失败,则极有可能是由于使用未初始化的内存而失败。
正如 Stanislav Volodarskiy 评论的那样,这绝对是一个错误(而且正是读取未初始化内存的错误):
char* json_string = malloc(RESPONSE_PACKAGE_BUFFER_SIZE);
if (!packageBuildFileDownload(..., &json_string, strlen(json_string))) {
要修复该错误,请执行以下操作:
char* json_string = malloc(RESPONSE_PACKAGE_BUFFER_SIZE);
if (!packageBuildFileDownload(..., &json_string, RESPONSE_PACKAGE_BUFFER_SIZE)) {