cJSON_Print trapped in an infinite loop when elements are added a certain way
Maintainer thường phản hồi trong vòng 12 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 35/100
Hướng nghiên cứu
Bắt đầu bằng cách biên dịch và chạy đoạn mã C tối giản để tái hiện hiện tượng treo trong cJSON_Print. Theo dõi quá trình duyệt qua mảng messages và các node system và message được tái sử dụng của nó, sau đó xác minh rằng việc in kết thúc với JSON hợp lệ và trình tự dọn dẹp vẫn an toàn.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Here is a strange behavior of cJSON_Print. When the subtree it is transversing contains a node referenced by an ancestor node, it ends up in an infinite loop. The only way this can happen is if leaf nodes link back to their parents and cJSON_Print tries to transverse this path, resulting in a circular dep. Even this assumption doesn't hold up considering that when the order of placing objects message and system into the messages array is swapped (i.e., adding system before message), printing works perfectly.
Here is a minimal snippet to reproduce this behavior.
#include <stdio.h>
#include <stdlib.h>
#include "../cJSON/cJSON.h"
int main() {
cJSON *bin = cJSON_CreateArray();
cJSON *root = cJSON_CreateObject();
cJSON *system = cJSON_CreateObject();
cJSON *message = cJSON_CreateObject();
cJSON *messages = cJSON_CreateArray();
cJSON_AddItemToArray(bin, root);
cJSON_AddItemToArray(bin, system);
cJSON_AddItemToArray(bin, message);
cJSON_AddItemToArray(messages, message);
cJSON_AddItemToArray(messages, system);
cJSON_AddItemToObject(root, "messages", messages);
char *json_string = cJSON_Print(root);
printf("%s\n", json_string);
free(json_string);
cleanup:
cJSON_DetachItemFromArray(bin, 0);
cJSON_DetachItemFromArray(bin, 0);
cJSON_DetachItemFromArray(bin, 0);
cJSON_Delete(root);
cJSON_Delete(bin);
return 0;
}
- Ngôn ngữ chính
- C
- Star
- 13k
- Fork
- 3.5k
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của DaveGamble/cJSON
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
DaveGamble/cJSON#1106 ·
Maintainer thường phản hồi trong vòng 12 ngày
-
Undefined-Behavior in function cJSON_SetNumberHelperCó thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
DaveGamble/cJSON#1100 · 1 reaction ·
Maintainer thường phản hồi trong vòng 12 ngày
-
CMake config files contain absolute install pathsCó thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 86/100
DaveGamble/cJSON#1094 · 9 bình luận · 1 reaction ·
Maintainer thường phản hồi trong vòng 12 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
DaveGamble/cJSON#1093 ·
Maintainer thường phản hồi trong vòng 12 ngày
-
Use-after-free in cJSONUtils_ApplyPatches when a patch removes the patch arrayCó thể đã có người làm @iliasabk đã nhận 37 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
DaveGamble/cJSON#1082 ·
Maintainer thường phản hồi trong vòng 12 ngày
Tất cả issue của DaveGamble/cJSON
Issue tương tự
-
Add `CPC_TAKE_TILL_CHARS`Đang mởdifficulty: easy
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 64/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
-
performance solver
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
ChefKissInc/Inferno#319 ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 91/100
FreeJoy-Team/FreeJoy#275 ·