1c2b37d2cSopenharmony_ci/* 2c2b37d2cSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3c2b37d2cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c2b37d2cSopenharmony_ci * you may not use this file except in compliance with the License. 5c2b37d2cSopenharmony_ci * You may obtain a copy of the License at 6c2b37d2cSopenharmony_ci * 7c2b37d2cSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c2b37d2cSopenharmony_ci * 9c2b37d2cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c2b37d2cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c2b37d2cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c2b37d2cSopenharmony_ci * See the License for the specific language governing permissions and 13c2b37d2cSopenharmony_ci * limitations under the License. 14c2b37d2cSopenharmony_ci */ 15c2b37d2cSopenharmony_ci 16c2b37d2cSopenharmony_ci#ifndef FUZZ_DATA_H 17c2b37d2cSopenharmony_ci#define FUZZ_DATA_H 18c2b37d2cSopenharmony_ci#include <string> 19c2b37d2cSopenharmony_ci#include "securec.h" 20c2b37d2cSopenharmony_ci 21c2b37d2cSopenharmony_cinamespace OHOS { 22c2b37d2cSopenharmony_ciusing namespace std; 23c2b37d2cSopenharmony_cinamespace { 24c2b37d2cSopenharmony_cistatic constexpr uint32_t BOOL_MODULO_NUM = 2; 25c2b37d2cSopenharmony_ci} 26c2b37d2cSopenharmony_ciclass FuzzData { 27c2b37d2cSopenharmony_cipublic: 28c2b37d2cSopenharmony_ci explicit FuzzData(const uint8_t *data, const size_t size) : pos_(0), data_(data), size_(size) {} 29c2b37d2cSopenharmony_ci 30c2b37d2cSopenharmony_ci template <class T> T GetData() 31c2b37d2cSopenharmony_ci { 32c2b37d2cSopenharmony_ci T object{}; 33c2b37d2cSopenharmony_ci size_t objectSize = sizeof(object); 34c2b37d2cSopenharmony_ci if (data_ == nullptr || objectSize > size_ - pos_) { 35c2b37d2cSopenharmony_ci return object; 36c2b37d2cSopenharmony_ci } 37c2b37d2cSopenharmony_ci errno_t ret = memcpy_s(&object, objectSize, data_ + pos_, objectSize); 38c2b37d2cSopenharmony_ci if (ret != EOK) { 39c2b37d2cSopenharmony_ci return {}; 40c2b37d2cSopenharmony_ci } 41c2b37d2cSopenharmony_ci pos_ += objectSize; 42c2b37d2cSopenharmony_ci return object; 43c2b37d2cSopenharmony_ci } 44c2b37d2cSopenharmony_ci 45c2b37d2cSopenharmony_ci std::string GetStringFromData(size_t pos, size_t strlen) 46c2b37d2cSopenharmony_ci { 47c2b37d2cSopenharmony_ci if (pos > size_) { 48c2b37d2cSopenharmony_ci return "test"; 49c2b37d2cSopenharmony_ci } 50c2b37d2cSopenharmony_ci char cstr[strlen + 1]; 51c2b37d2cSopenharmony_ci cstr[strlen] = '\0'; 52c2b37d2cSopenharmony_ci pos_ = pos; 53c2b37d2cSopenharmony_ci for (size_t i = 0; i < strlen; i++) { 54c2b37d2cSopenharmony_ci char tmp = GetData<char>(); 55c2b37d2cSopenharmony_ci if (tmp == '\0') { 56c2b37d2cSopenharmony_ci tmp = '1'; 57c2b37d2cSopenharmony_ci } 58c2b37d2cSopenharmony_ci cstr[i] = tmp; 59c2b37d2cSopenharmony_ci } 60c2b37d2cSopenharmony_ci std::string str(cstr); 61c2b37d2cSopenharmony_ci return str; 62c2b37d2cSopenharmony_ci } 63c2b37d2cSopenharmony_ci 64c2b37d2cSopenharmony_ci std::string GenerateRandomString() 65c2b37d2cSopenharmony_ci { 66c2b37d2cSopenharmony_ci return GetStringFromData(0, (GetData<uint32_t>() % size_)); 67c2b37d2cSopenharmony_ci } 68c2b37d2cSopenharmony_ci 69c2b37d2cSopenharmony_ci template <class T> T GenerateRandomEnmu(T enmuMax) 70c2b37d2cSopenharmony_ci { 71c2b37d2cSopenharmony_ci return static_cast<T>(GetData<uint32_t>() % (static_cast<uint32_t>(enmuMax) + 1)); 72c2b37d2cSopenharmony_ci } 73c2b37d2cSopenharmony_ci 74c2b37d2cSopenharmony_ci bool GenerateRandomBool() 75c2b37d2cSopenharmony_ci { 76c2b37d2cSopenharmony_ci return (GetData<uint32_t>() % BOOL_MODULO_NUM) == 0; 77c2b37d2cSopenharmony_ci } 78c2b37d2cSopenharmony_ci 79c2b37d2cSopenharmony_cipublic: 80c2b37d2cSopenharmony_ci size_t pos_; 81c2b37d2cSopenharmony_ci 82c2b37d2cSopenharmony_ciprivate: 83c2b37d2cSopenharmony_ci const uint8_t *data_; 84c2b37d2cSopenharmony_ci const size_t size_; 85c2b37d2cSopenharmony_ci}; 86c2b37d2cSopenharmony_ci} // namespace OHOS 87c2b37d2cSopenharmony_ci#endif // FUZZ_DATA_H