1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ChangeJsonUtil.h"
17 #include <random>
18 #include <fstream>
19 #include <iostream>
20 #include "secodeFuzz.h"
21 #include "cJSON.h"
22 #include "securec.h"
23 using namespace fuzztest;
24
25 namespace {
26 const int DEFAULT_LENGTH = 1000;
27 const int DEFAULT_INT = 1000;
28 const std::string DEFAULT_STRING = "aaaa";
29 }
30
ModifyObject(cJSON * object,uint64_t & idx)31 void ChangeJsonUtil::ModifyObject(cJSON *object, uint64_t& idx)
32 {
33 if (!object) {
34 return;
35 }
36 cJSON *item = nullptr;
37 cJSON_ArrayForEach(item, object) {
38 if (item->type == cJSON_String) {
39 std::string strVal = DT_SetGetString(&g_Element[idx], strlen(item->valuestring) + 1, DEFAULT_LENGTH,
40 (char*)item->valuestring);
41 idx++;
42 if (item->valuestring != nullptr) {
43 cJSON_free(item->valuestring); // 释放原字符串内存
44 }
45 item->valuestring = nullptr;
46 int length = strVal.length() + 1;
47
48 void* ptr = malloc(length * sizeof(char));
49 if (ptr != nullptr) {
50 item->valuestring = reinterpret_cast<char*>(ptr);
51 }
52 errno_t ret1 = strcpy_s(item->valuestring, length, strVal.c_str()); // 复制字符串内容
53 if (ret1 != EOK) {
54 printf("strcpy_s in modifyObject copy error");
55 }
56 } else if (item->type == cJSON_Number) {
57 int intVal = *(s32 *)DT_SetGetS32(&g_Element[idx], item->valueint);
58 idx++;
59 item->valueint = intVal;
60 } else if (item->type == cJSON_True || item->type == cJSON_False) {
61 std::random_device rd;
62 std::mt19937 gen(rd());
63 std::bernoulli_distribution distribution(0.5); // 0.5 is probability to generate true or false
64 bool ret = distribution(gen);
65 item->type = ret ? cJSON_True : cJSON_False;
66 } else if (item->type == cJSON_Object) {
67 cJSON *arrayItem = nullptr;
68 cJSON_ArrayForEach(arrayItem, item) {
69 ModifyObject(arrayItem, idx);
70 }
71 } else if (item->type == cJSON_Array) {
72 cJSON *objItem = nullptr;
73 cJSON_ArrayForEach(objItem, item) {
74 ModifyObject(objItem, idx);
75 }
76 }
77 }
78 }
79
ModifyObject4ChangeType(cJSON * object,uint64_t & idx)80 void ChangeJsonUtil::ModifyObject4ChangeType(cJSON *object, uint64_t& idx)
81 {
82 if (!object) {
83 return;
84 }
85 cJSON *item = nullptr;
86 cJSON_ArrayForEach(item, object) {
87 if (item->type == cJSON_String) {
88 int32_t intValue = *(s32 *)DT_SetGetS32(&g_Element[idx], DEFAULT_INT);
89 idx++;
90 item->type = cJSON_Number;
91 item->valuedouble = static_cast<double>(intValue);
92 item->valueint = intValue;
93 if (item->valuestring != nullptr) {
94 cJSON_free(item->valuestring); // 释放原字符串内存
95 }
96 item->valuestring = nullptr;
97 } else if (item->type == cJSON_Number || item->type == cJSON_True || item->type == cJSON_False) {
98 std::string strVal = DT_SetGetString(&g_Element[idx], DEFAULT_STRING.size() + 1, DEFAULT_LENGTH,
99 (char*)DEFAULT_STRING.c_str());
100 idx++;
101 item->type = cJSON_String;
102 int length = strVal.length() + 1;
103 void* ptr = malloc(length * sizeof(char));
104 if (ptr != nullptr) {
105 item->valuestring = reinterpret_cast<char*>(ptr);
106 }
107 errno_t ret2 = strcpy_s(item->valuestring, length, strVal.c_str()); // 复制字符串内容
108 if (ret2 != EOK) {
109 printf("strcpy_s in modifyObject4ChangeType copy error");
110 }
111 } else if (item->type == cJSON_Object) {
112 cJSON *arrayItem = nullptr;
113 cJSON_ArrayForEach(arrayItem, item) {
114 ModifyObject4ChangeType(arrayItem, idx);
115 }
116 } else if (item->type == cJSON_Array) {
117 cJSON *objItem = nullptr;
118 cJSON_ArrayForEach(objItem, item) {
119 ModifyObject4ChangeType(objItem, idx);
120 }
121 }
122 }
123 }
124
WriteFile(std::string filePath,cJSON * object)125 void ChangeJsonUtil::WriteFile(std::string filePath, cJSON *object)
126 {
127 // Check if cJSON object is valid
128 if (object == nullptr) {
129 std::cerr << "Error: cJSON object is null." << std::endl;
130 return;
131 }
132
133 // Open file stream
134 std::ofstream outFile(filePath);
135 if (!outFile.is_open()) {
136 std::cerr << "Error opening file: " << filePath << std::endl;
137 return;
138 }
139
140 // Convert cJSON object to string
141 char *jsonStr = cJSON_Print(object);
142 if (jsonStr == nullptr) {
143 std::cerr << "Error converting cJSON object to string." << std::endl;
144 outFile.close();
145 return;
146 }
147
148 // Write JSON string to file
149 outFile << jsonStr << std::endl;
150
151 // Clean up
152 cJSON_free(jsonStr);
153 outFile.close();
154
155 std::cout << "JSON content successfully written to file: " << filePath << std::endl;
156 }
157
WriteFile(std::string filePath,std::string str)158 void ChangeJsonUtil::WriteFile(std::string filePath, std::string str)
159 {
160 std::ofstream outFile(filePath);
161 if (!outFile.is_open()) {
162 std::cerr << "Error opening file: " << filePath << std::endl;
163 return;
164 }
165 outFile << str << std::endl;
166 std::cout << "Str content successfully written to file: " << filePath << std::endl;
167 }